Heim >Backend-Entwicklung >Golang >Wie entmarshaliere ich JSON mit falschem Zeitzonenversatz in Go?

Wie entmarshaliere ich JSON mit falschem Zeitzonenversatz in Go?

Susan Sarandon
Susan SarandonOriginal
2024-11-05 08:25:02975Durchsuche

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

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.

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>

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>

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!

Stellungnahme:
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