Heim > Backend-Entwicklung > Golang > Wie gehe ich beim Unmarshaling von JSON in Go mit Nicht-RFC 3339-Zeitformaten um?

Wie gehe ich beim Unmarshaling von JSON in Go mit Nicht-RFC 3339-Zeitformaten um?

DDD
Freigeben: 2024-12-30 22:02:11
Original
520 Leute haben es durchsucht

How to Handle Non-RFC 3339 Time Formats When Unmarshaling JSON in Go?

Benutzerdefiniertes JSON-Unmarshaling für Nicht-RFC 3339-Zeitformate

Das Encoding/JSON-Paket in Go hält sich strikt an das RFC 3339-Zeitformat, wenn Deserialisieren von JSON-Daten. Dies kann unpraktisch sein, wenn Sie mit Zeitformaten arbeiten, die von diesem Standard abweichen.

Lösung: Implementierung benutzerdefinierter Marshaler und Unmarshaler

Anstatt die vorhandenen JSON-Daten zu ändern oder sich darauf zu verlassen Für Zwischenkonvertierungsschritte besteht eine geeignetere Lösung darin, die Schnittstellen json.Marshaler und json.Unmarshaler auf einer benutzerdefinierten Ebene zu implementieren Typ.

Das folgende Beispiel zeigt, wie ein benutzerdefinierter Typ (CustomTime) erstellt wird, der die Deserialisierung eines bestimmten Nicht-RFC 3339-Zeitformats verarbeitet:

import (
    "fmt"
    "strconv"
    "strings"
    "time"

    "github.com/golang/protobuf/ptypes/timestamp"
)

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()
}

type Args struct {
    Time CustomTime
}

var data = `
    {"Time": "2014/08/01|11:27:18"}
`

func main() {
    a := Args{}
    if err := json.Unmarshal([]byte(data), &a); err != nil {
        fmt.Println("Error unmarshaling: ", err)
        return
    }

    if !a.Time.IsSet() {
        fmt.Println("Time not set")
    } else {
        fmt.Println(a.Time.String())
    }
}
Nach dem Login kopieren

Hinweis: Die CustomTime.IsSet()-Methode prüft, ob das Zeitfeld nicht Null ist, und bietet so eine Möglichkeit, festzustellen, ob der Zeitwert tatsächlich festgelegt wurde oder nicht.

Durch die Implementierung benutzerdefinierter Marshaler und Unmarshaler erhalten Sie die Flexibilität, Zeitformate zu verarbeiten, die vom RFC 3339-Standard abweichen können, und ermöglichen so eine nahtlose Deserialisierung von JSON-Daten in Go.

Das obige ist der detaillierte Inhalt vonWie gehe ich beim Unmarshaling von JSON in Go mit Nicht-RFC 3339-Zeitformaten um?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage