0 Tage Serie
go / intermediate
Snippet

Implementierung benutzerdefinierter JSON-Serialisierung für Datumsfelder

Standardmäßig formatiert Gos json.Marshal Typen nach Standard-Serialisierungsregeln. Durch die Implementierung des json.Marshaler-Interfaces (Definieren einer MarshalJSON() ([]byte, error)-Methode) können Sie genau anpassen, wie ein Typ in JSON dargestellt wird, was für benutzerdefinierte Datumsformate, Maskierung sensibler Felder oder Strukturänderungen nützlich ist.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main
import (
"encoding/json"
"fmt"
"time"
)
type CustomDate time.Time
func (cd CustomDate) MarshalJSON() ([]byte, error) {
formatted := fmt.Sprintf("\"%s\"", time.Time(cd).Format("2006-01-02"))
return []byte(formatted), nil
}
type Event struct {
Name string `json:"name"`
Date CustomDate `json:"date"`
}
func main() {
evt := Event{
Name: "Gala Concert",
Date: CustomDate(time.Date(2026, 7, 5, 0, 0, 0, 0, time.UTC)),
}
data, _ := json.Marshal(evt)
fmt.Println(string(data))
}
Erklärung
1
type CustomDate time.Time
Erstellt einen benutzerdefinierten Typ basierend auf time.Time, um das globale Verhalten von time.Time nicht zu ändern.
2
func (cd CustomDate) MarshalJSON() ([]byte, error) {
Implementiert das json.Marshaler-Interface, um die Standard-Serialisierung für CustomDate zu überschreiben.
3
formatted := fmt.Sprintf("\"%s\"", time.Time(cd).Format("2006-01-02"))
Formatiert die Zeit als YYYY-MM-DD String, eingeschlossen in JSON-Anführungszeichen.
4
data, _ := json.Marshal(evt)
Serialisiert das Event-Struct und ruft dabei automatisch MarshalJSON für das Feld Date auf.