Problem:
Wie können wir eine Struktur mit codieren? eine eingebettete Struktur mit einer benutzerdefinierten MarshalJSON()-Methode? Die erwartete Ausgabe besteht darin, das benutzerdefinierte Marshalling der eingebetteten Struktur beizubehalten und gleichzeitig die Felder der äußeren Struktur zu codieren.
Beispiel:
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` }
Wenn die eingebettete Person struct verfügt über eine benutzerdefinierte MarshalJSON()-Methode:
func (p *Person) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(p.Name), }) }
Das Marshallen einer Employee-Instanz bricht ab, was zur Folge hat in:
{"name": "BOB"}
Lösung:
Anstatt MarshalJSON() für Person zu implementieren, erstellen Sie einen neuen Namenstyp, der MarshalJSON() implementiert. Ändern Sie dann Person, um diesen Namenstyp zu verwenden:
type Name string func (n Name) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(string(n)), }) } type Person struct { Name Name `json:"name"` }
Dadurch kann die benutzerdefinierte Marshalling-Logik auf das Feld „Name“ angewendet werden, während die Mitarbeiterfelder weiterhin wie erwartet codiert werden.
Generische Lösung:
Für eine allgemeinere Lösung implementieren Sie MarshalJSON() in der äußeren Struktur. Während Methoden des inneren Typs auf den äußeren Typ heraufgestuft werden, kann der äußere Typ das Ergebnis dann in eine generische Struktur wie „map[string]interface{} entpacken und seine eigenen Felder hinzufügen.
Beispiel:
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` } func (e *Employee) MarshalJSON() ([]byte, error) { b, err := e.Person.MarshalJSON() if err != nil { return nil, err } var m map[string]interface{} if err := json.Unmarshal(b, &m); err != nil { return nil, err } m["jobRole"] = e.JobRole return json.Marshal(m) }
Das obige ist der detaillierte Inhalt vonWie kann MarshalJSON() für eingebettete Strukturen mit benutzerdefiniertem Marshaling korrekt gemarshallt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!