JSON-Unmarshaling von Nicht-RFC 3339-Zeitformaten in Go
Das Standardverhalten des Encoding/JSON-Pakets in Go ist das Marshallen und Unmarshal-Zeitwerte im RFC 3339-Format. Was aber, wenn Sie auf JSON-Daten mit Zeitwerten in einem anderen Format stoßen?
Lösung mit manueller Transformation
Ein Ansatz besteht darin, den Zeitwert in eine Zeichenfolge zu deserialisieren. Wandeln Sie es manuell in das RFC 3339-Format um und wenden Sie dann json.Unmarshal erneut an. Obwohl diese Methode funktioniert, verursacht sie zusätzlichen Verarbeitungsaufwand und überfüllt den Code.
Benutzerdefinierter Zeittyp
Eine elegantere Lösung ist die Implementierung von json.Marshaler und json.Unmarshaler Schnittstellen für einen benutzerdefinierten Zeittyp. Dies ermöglicht eine benutzerdefinierte Handhabung der Serialisierung und Deserialisierung von Zeitwerten.
Beispielimplementierung
Hier ist ein Beispiel für einen benutzerdefinierten Zeittyp namens CustomTime:
type CustomTime struct { time.Time } const ctLayout = "2006/01/02|15:04:05" func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) { s := strings.Trim(string(b), "\"") if s == "null" { ct.Time = time.Time{} return } ct.Time, err = time.Parse(ctLayout, s) return } func (ct *CustomTime) MarshalJSON() ([]byte, error) { if ct.Time.IsZero() { return []byte("null"), nil } return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(ctLayout))), nil } var nilTime = (time.Time{}).UnixNano() func (ct *CustomTime) IsSet() bool { return !ct.IsZero() }
In diesem benutzerdefinierten Zeittyp:
Verwendung
Jetzt können Sie den CustomTime-Typ in Ihrem JSON-Deserialisierungscode verwenden:
type Args struct { Time CustomTime } var data = ` { "Time": "2014/08/01|11:27:18" } ` func main() { a := Args{} fmt.Println(json.Unmarshal([]byte(data), &a)) fmt.Println(a.Time.String()) }
Dieser Ansatz ermöglicht Sie können nicht-RFC 3339-Zeitformate in JSON-Daten elegant und effizient verarbeiten, ohne die Flexibilität zu beeinträchtigen. Es zeigt auch die Leistungsfähigkeit der Implementierung benutzerdefinierter json.Marshaler- und json.Unmarshaler-Schnittstellen zur Handhabung der Serialisierung und Deserialisierung von Datentypen.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Nicht-RFC 3339-Zeitformaten im JSON-Unmarshaling von Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!