Gos JSON-Unmarshalling hat Probleme mit Datums- und Uhrzeitangaben, die gemäß ISO8601/RFC3339 formatiert sind und Zeitzonenversätze in der haben Format 0200 statt 02:00.
Falsches JSON-Format:
2016-08-08T21:35:14.052975+0200
Erwartetes korrektes Format:
2016-08-08T21:35:14.052975+02:00
Mögliche Ursache:
Der JSON wurde mit der strftime-Funktion von C mit einer Formatzeichenfolge generiert, die den Doppelpunkt im Zeitzonen-Offset nicht enthält.
Um dieses Problem zu beheben und das korrekte Unmarshalling beider Formate zu ermöglichen, kann ein benutzerdefinierter Zeitfeldtyp definiert werden:
<code class="go">type MyTime struct { time.Time } func (self *MyTime) UnmarshalJSON(b []byte) (err error) { s := string(b) // Remove double quotes from JSON value s = s[1:len(s)-1] t, err := time.Parse(time.RFC3339Nano, s) if err != nil { t, err = time.Parse("2006-01-02T15:04:05.999999999Z0700", s) } self.Time = t return }</code>
In diesem benutzerdefinierten Typ versucht die UnmarshalJSON-Methode um die Zeichenfolge sowohl gemäß RFC3339Nano (mit einem Doppelpunkt im Zeitzonen-Offset) als auch gemäß einer modifizierten Version von RFC3339Nano ohne Doppelpunkt zu analysieren.
Um den benutzerdefinierten Zeitfeldtyp zu verwenden:
<code class="go">type Test struct { Time MyTime `json:"time"` }</code>
Diese Struktur kann dann aus jedem JSON-Format mit dem falschen oder korrekten Zeitzonenversatz entmarshallt werden.
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich JSON mit falschem Zeitzonenversatz in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!