Benutzerdefiniertes Unmarshaling für Nicht-RFC 3339-Zeitformate in Go JSON
In Go hält sich das Encoding/JSON-Paket strikt an RFC 3339, wenn Deserialisieren von Zeitwerten. Es kommt jedoch häufig vor, dass Daten in unterschiedlichen Zeitformaten vorliegen. Dies kann ein Problem sein, wenn Sie umständliche Konvertierungen vermeiden möchten.
Benutzerdefinierte Typen verwenden
Um dies zu bewältigen, können Sie die Schnittstellen json.Marshaler und json.Unmarshaler implementieren auf einem benutzerdefinierten Typ. Dadurch können Sie definieren, wie Ihr Typ von und zu JSON gemarshallt und entmarshallt wird.
Mit dem folgenden CustomTime-Typ können Sie beispielsweise Zeitwerte aus verschiedenen Formaten entmarshalieren:
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 dieser Typ:
Sie können den CustomTime-Typ in Ihren JSON-Strukturen verwenden, um die Deserialisierung von Zeitwerten zu handhaben aus Nicht-RFC 3339-Formaten:
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()) }
In diesem Beispiel verwendet die Args-Struktur den CustomTime-Typ für das Zeitfeld. Beim Deserialisieren von JSON-Daten mit einem Zeitformat, das nicht RFC 3339 entspricht, verarbeitet der CustomTime-Typ die Konvertierung korrekt.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Nicht-RFC 3339-Zeitformaten beim Go JSON Unmarshaling um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!