Heim >Backend-Entwicklung >Golang >Wie deserialisiere ich Nicht-RFC 3339-Zeitformate in Go mit „encoding/json'?

Wie deserialisiere ich Nicht-RFC 3339-Zeitformate in Go mit „encoding/json'?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-18 20:57:10713Durchsuche

How to Deserialize Non-RFC 3339 Time Formats in Go with `encoding/json`?

Nicht-RFC 3339-Zeitformate in Go mit „encoding/json“ deserialisieren

Bei Verwendung des Pakets „encoding/json“ in Go lautet das Standardverhalten für das Unmarshaling von Zeitwerten Halten Sie sich strikt an das RFC 3339-Format. Was aber, wenn Sie auf Zeitformate stoßen, die von diesem Standard abweichen?

Benutzerdefinierte Zeittyp-Implementierung

Um solche Situationen zu bewältigen, können Sie die Schnittstellen json.Marshaler und json.Unmarshaler auf einem benutzerdefinierten Format implementieren Typ. Dadurch können Sie benutzerdefinierte Kodierungs- und Dekodierungslogik für Ihr spezifisches Zeitformat definieren.

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

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

Verwendung in einer Struktur

Um den CustomTime-Typ zu verwenden, können Sie ihn als Feld in ein einbetten Struktur:

type Args struct {
    Time CustomTime
}

Beispiel

Hier ist ein Beispiel für die Verwendung der Args-Struktur und des CustomTime-Typs zum Entmarshalieren einer JSON-Zeichenfolge, die ein Nicht-RFC 3339-Zeitformat enthält:

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

Ausgabe:

<nil>
2014-08-01 11:27:18 +0000 UTC

Durch Implementierung der benutzerdefinierten CustomTime Typ können Sie die Deserialisierung von Zeitformaten verarbeiten, die nicht im RFC 3339-Format vorliegen.

Das obige ist der detaillierte Inhalt vonWie deserialisiere ich Nicht-RFC 3339-Zeitformate in Go mit „encoding/json'?. 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