Benutzerdefiniertes Un/Marshaling für nicht standardmäßige JSON-Zeitformate
Beim Umgang mit JSON-Daten, die Zeitwerte in nicht standardmäßigen Formaten enthalten, Beim integrierten JSON-Decoder können Fehler auftreten. Um solche Situationen zu bewältigen, können benutzerdefinierte Marshall- und Unmarshal-Funktionen implementiert werden.
Bedenken Sie den folgenden JSON:
{ "name": "John", "birth_date": "1996-10-07" }
Und die gewünschte Go-Struktur:
type Person struct { Name string `json:"name"` BirthDate time.Time `json:"birth_date"` }
Die Verwendung des Standard-JSON-Decoders würde beim Parsen des Felds „birth_date“ zu einem Fehler führen. Um dieses Verhalten anzupassen, kann ein Typalias erstellt und der Struktur hinzugefügt werden:
type JsonBirthDate time.Time
Dann werden benutzerdefinierte Marshall- und Unmarshal-Funktionen implementiert:
func (j *JsonBirthDate) UnmarshalJSON(b []byte) error { s := strings.Trim(string(b), `"`) // Remove quotes t, err := time.Parse("2006-01-02", s) if err != nil { return err } *j = JsonBirthDate(t) return nil } func (j JsonBirthDate) MarshalJSON() ([]byte, error) { return json.Marshal(time.Time(j)) }
Mit diesen benutzerdefinierten Funktionen kann der JSON nun wie vorgesehen in die Go-Struktur dekodiert werden:
person := Person{} decoder := json.NewDecoder(req.Body); if err := decoder.Decode(&person); err != nil { log.Println(err) } // Print the birth date using the Format function fmt.Println(person.BirthDate.Format("2006-01-02"))
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3