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
Linda HamiltonOriginal
2024-12-18 21:09:131015Durchsuche

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

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

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!

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