Heim > Artikel > Backend-Entwicklung > Wie entmarshaliere ich falsch formatierte Datetime-Strings in Go?
Unmarshal Falsch formatiertes Datetime
Hintergrund
Beim Versuch, eine Datetime-Zeichenfolge in Go zu analysieren Bei Verwendung von time.Parse kann es fehlschlagen, wenn der Zeitzonenoffset falsch formatiert ist. Insbesondere, wenn der Offset als „0200“ anstelle von „02:00“ angegeben wird, wie in RFC3339 gefordert.
Frage
Gegeben ist ein Satz von JSON-Dateien, die enthalten Datums- und Uhrzeitangaben mit dem falschen Offset-Format. Wie können wir sie in Go korrekt entmarshallen, ohne das Format der zurückgemarshallten Datums- und Uhrzeitangaben zu ändern? JSON?
Antwort
Benutzerdefiniertes Zeitfeld
Um sowohl gültige als auch ungültige Offset-Formate zu verarbeiten, können wir unsere eigenen definieren Benutzerdefinierter Zeitfeldtyp. Dadurch können wir das standardmäßige Unmarshal-Verhalten überschreiben und die Datums-/Uhrzeitzeichenfolge manuell gemäß einem der beiden erwarteten Formate analysieren.
Beispielimplementierung
<code class="go">type MyTime struct { time.Time } func (self *MyTime) UnmarshalJSON(b []byte) (err error) { s := string(b) // Remove quotes from JSON string (optional) 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 } type Test struct { Time MyTime `json:"time"` }</code>
In diesem Beispiel verwenden wir die UnmarshalJSON-Methode, um das standardmäßige Unmarshaling-Verhalten zu überschreiben. Wir entfernen zunächst alle umschließenden Anführungszeichen um die Datums-/Uhrzeitzeichenfolge und versuchen dann, sie im Standardformat time.RFC3339Nano zu analysieren. Wenn dies fehlschlägt, versuchen wir, auch das falsche Format („2006-01-02T15:04:05.999999999Z0700“) zu analysieren.
RFC3339Nano-Format in JSON-Metadaten
Um die Verwendung des RFC3339Nano-Formats für die benutzerdefinierte Angabe anzugeben Um ein Zeitfeld in JSON zu erstellen, können wir einfach dieselbe Formatzeichenfolge wie in der UnmarshalJSON-Methode verwenden:
<code class="go">type Test struct { Time MyTime `json:"time,omitempty"` }</code>
Dies zeigt an, dass das Zeitfeld in JSON als Zeichenfolge im RFC3339Nano-Format dargestellt wird. Beim Zurückmarshalling zu JSON wird die überschriebene MarshalJSON-Methode vom Typ MyTime verwendet, um sicherzustellen, dass das richtige Format beibehalten wird.
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich falsch formatierte Datetime-Strings in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!