Anpassen des JSON-Zeit-Unmarshalings in Go
Beim Umgang mit JSON-Daten, die Zeitwerte enthalten, kann das Encoding/JSON-Paket in Go einschränkend sein wenn das Zeitformat nicht RFC 3339 entspricht. Es ist zwar möglich, die Zeit zum Parsen manuell in das RFC 3339-Format umzuwandeln, Es gibt einen effizienteren Ansatz.
Marshaler/Unmarshaler-Schnittstellen implementieren
Um benutzerdefinierte Zeitformate zu verarbeiten, erstellen Sie einen benutzerdefinierten Typ, der die Schnittstellen json.Marshaler und json.Unmarshaler implementiert . Dadurch können Sie definieren, wie der Zeitwert serialisiert und deserialisiert werden soll.
Hier ist ein Beispiel für einen benutzerdefinierten Typ 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 Typ:
Verwendung
Sobald der CustomTime-Typ definiert ist, wird er verwendet kann als Strukturfeld verwendet werden, um JSON-Daten mit benutzerdefinierten Zeitformaten zu deserialisieren.
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 werden die JSON-Daten erfolgreich deserialisiert, wobei sich das Zeitfeld in einem benutzerdefinierten „2006/01/02|15:04“ befindet :05"-Format.
Das obige ist der detaillierte Inhalt vonWie kann ich das JSON-Zeit-Unmarshaling in Go anpassen, um Nicht-RFC 3339-Formate zu verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!