Wie entmarshaliere ich JSON mit falschem Zeitzonenversatz in Go?

Susan Sarandon
Freigeben: 2024-11-05 08:25:02
Original
964 Leute haben es durchsucht

How to Unmarshal JSON with Incorrect Timezone Offset in Go?

Ungültiges Datetime-Format im JSON-Unmarshalling

Hintergrund

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.

Problem

Falsches JSON-Format:

2016-08-08T21:35:14.052975+0200
Nach dem Login kopieren

Erwartetes korrektes Format:

2016-08-08T21:35:14.052975+02:00
Nach dem Login kopieren

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.

Lösung

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>
Nach dem Login kopieren

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.

Verwendung

Um den benutzerdefinierten Zeitfeldtyp zu verwenden:

<code class="go">type Test struct {
    Time MyTime `json:"time"`
}</code>
Nach dem Login kopieren

Diese Struktur kann dann aus jedem JSON-Format mit dem falschen oder korrekten Zeitzonenversatz entmarshallt werden.

Hinweise

  • Standardmäßig ist das RFC3339Nano-Format in der Zeit. Parse verwendet „Z“ für den Zeitzonenversatz, während im modifizierten Format „Z0700“ verwendet wird.
  • Das Jahr „2006“ im Zeitformat ist ein Verweis auf das erste Jahr der Veröffentlichung von Go.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage