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
Freigeben: 2024-12-18 20:57:10
Original
709 Leute haben es durchsucht

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

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

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

Ausgabe:

<nil>
2014-08-01 11:27:18 +0000 UTC
Nach dem Login kopieren

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!

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