In Go können beim Unmarshaling von JSON-Daten in eine Struktur mit eingebetteten Feldern Probleme auftreten, wenn die eingebettete Struktur ihre definiert eigene UnmarshalJSON-Methode. Dies liegt daran, dass die JSON-Bibliothek UnmarshalJSON der eingebetteten Struktur aufruft und die in der enthaltenden Struktur definierten Felder ignoriert.
Betrachten Sie die folgende Strukturdefinition:
type Outer struct {
Inner
Num int
}
type Inner struct {
Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
i.Data = string(data)
return nil
}
Beim Unmarshaling von JSON in Outer mit json.Unmarshal(data, &Outer{}) löst das Inner-Feld seine UnmarshalJSON-Methode aus und verbraucht die gesamte JSON-Zeichenfolge. Dadurch wird das Num-Feld in Outer ignoriert.
Um dieses Problem zu beheben, konvertieren Sie die eingebettete Struktur Inner in ein explizites Feld in Outer:
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
Indem Sie Inner zu einem expliziten Feld machen, stellen Sie sicher, dass die JSON-Bibliothek die Daten in die entsprechenden Felder von Outer, einschließlich des Num-Felds, entmarshmt.
import (
"encoding/json"
"fmt"
)
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
type Inner struct {
Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
i.Data = string(data)
return nil
}
func main() {
data := []byte(`{"Data": "Example", "Num": 42}`)
var outer Outer
err := json.Unmarshal(data, &outer)
if err != nil {
fmt.Println(err)
}
fmt.Println(outer.I.Data, outer.Num) // Output: Example 42
}
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