Heim > Backend-Entwicklung > Golang > Wie kann ich das JSON-Zeit-Unmarshaling in Go anpassen, um Nicht-RFC 3339-Formate zu verarbeiten?

Wie kann ich das JSON-Zeit-Unmarshaling in Go anpassen, um Nicht-RFC 3339-Formate zu verarbeiten?

Linda Hamilton
Freigeben: 2024-12-18 21:09:13
Original
991 Leute haben es durchsucht

How Can I Customize JSON Time Unmarshaling in Go to Handle Non-RFC 3339 Formats?

Anpassen des JSON-Zeit-Unmarshalings in Go

Beim Umgang mit JSON-Daten, die Zeitwerte enthalten, kann das Encoding/JSON-Paket in Go einschränkend sein wenn das Zeitformat nicht RFC 3339 entspricht. Es ist zwar möglich, die Zeit zum Parsen manuell in das RFC 3339-Format umzuwandeln, Es gibt einen effizienteren Ansatz.

Marshaler/Unmarshaler-Schnittstellen implementieren

Um benutzerdefinierte Zeitformate zu verarbeiten, erstellen Sie einen benutzerdefinierten Typ, der die Schnittstellen json.Marshaler und json.Unmarshaler implementiert . Dadurch können Sie definieren, wie der Zeitwert serialisiert und deserialisiert werden soll.

Hier ist ein Beispiel für einen benutzerdefinierten Typ namens CustomTime:

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

In diesem benutzerdefinierten Typ:

  • UnmarshalJSON konvertiert die JSON-Zeichenfolge mithilfe eines angegebenen Benutzers in einen time.Time-Wert Layout.
  • MarshalJSON konvertiert den time.Time-Wert in eine JSON-Zeichenfolge unter Verwendung desselben benutzerdefinierten Layouts.
  • IsSet ist eine optionale Methode, um zu überprüfen, ob ein CustomTime-Wert festgelegt wurde (nicht Null).

Verwendung

Sobald der CustomTime-Typ definiert ist, wird er verwendet kann als Strukturfeld verwendet werden, um JSON-Daten mit benutzerdefinierten Zeitformaten zu deserialisieren.

type Args struct {
    Time CustomTime
}

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

func main() {
    a := Args{}
    fmt.Println(json.Unmarshal([]byte(data), &a))
    fmt.Println(a.Time.String())
}
Nach dem Login kopieren

In diesem Beispiel werden die JSON-Daten erfolgreich deserialisiert, wobei sich das Zeitfeld in einem benutzerdefinierten „2006/01/02|15:04“ befindet :05"-Format.

Das obige ist der detaillierte Inhalt vonWie kann ich das JSON-Zeit-Unmarshaling in Go anpassen, um Nicht-RFC 3339-Formate zu verarbeiten?. 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