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

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

Linda Hamilton
Linda HamiltonOriginal
2024-12-26 00:22:09996Durchsuche

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

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

In Go hält sich das Encoding/JSON-Paket strikt an RFC 3339, wenn Deserialisieren von Zeitwerten. Es kommt jedoch häufig vor, dass Daten in unterschiedlichen Zeitformaten vorliegen. Dies kann ein Problem sein, wenn Sie umständliche Konvertierungen vermeiden möchten.

Benutzerdefinierte Typen verwenden

Um dies zu bewältigen, können Sie die Schnittstellen json.Marshaler und json.Unmarshaler implementieren auf einem benutzerdefinierten Typ. Dadurch können Sie definieren, wie Ihr Typ von und zu JSON gemarshallt und entmarshallt wird.

Mit dem folgenden CustomTime-Typ können Sie beispielsweise Zeitwerte aus verschiedenen Formaten entmarshalieren:

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 dieser Typ:

  • Die UnmarshalJSON-Methode analysiert Zeitwerte aus einem benutzerdefinierten Format ("2006/01/02|15:04:05").
  • Die MarshalJSON-Methode gibt den Zeitwert im gleichen benutzerdefinierten Format aus.
  • Die IsSet-Methode prüft, ob der Zeitwert vorhanden ist set (ungleich Null).

Sie können den CustomTime-Typ in Ihren JSON-Strukturen verwenden, um die Deserialisierung von Zeitwerten zu handhaben aus Nicht-RFC 3339-Formaten:

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 verwendet die Args-Struktur den CustomTime-Typ für das Zeitfeld. Beim Deserialisieren von JSON-Daten mit einem Zeitformat, das nicht RFC 3339 entspricht, verarbeitet der CustomTime-Typ die Konvertierung korrekt.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Nicht-RFC 3339-Zeitformaten beim Go JSON Unmarshaling um?. 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