Bei Verwendung des Pakets „encoding/json“ in Go lautet das Standardverhalten für das Unmarshaling von Zeitwerten Halten Sie sich strikt an das RFC 3339-Format. Was aber, wenn Sie auf Zeitformate stoßen, die von diesem Standard abweichen?
Um solche Situationen zu bewältigen, können Sie die Schnittstellen json.Marshaler und json.Unmarshaler auf einem benutzerdefinierten Format implementieren Typ. Dadurch können Sie benutzerdefinierte Kodierungs- und Dekodierungslogik für Ihr spezifisches Zeitformat definieren.
Hier ist ein Beispiel für einen benutzerdefinierten CustomTime-Typ:
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() }
Um den CustomTime-Typ zu verwenden, können Sie ihn als Feld in ein einbetten Struktur:
type Args struct { Time CustomTime }
Hier ist ein Beispiel für die Verwendung der Args-Struktur und des CustomTime-Typs zum Entmarshalieren einer JSON-Zeichenfolge, die ein Nicht-RFC 3339-Zeitformat enthält:
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()) }
Ausgabe:
<nil> 2014-08-01 11:27:18 +0000 UTC
Durch Implementierung der benutzerdefinierten CustomTime Typ können Sie die Deserialisierung von Zeitformaten verarbeiten, die nicht im RFC 3339-Format vorliegen.
Das obige ist der detaillierte Inhalt vonWie deserialisiere ich Nicht-RFC 3339-Zeitformate in Go mit „encoding/json'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!