Idiomatische Möglichkeit, eine Struktur mit der benutzerdefinierten MarshalJSON()-Methode einzubetten
Angesichts der folgenden Strukturen können wir eine Employee-Struktur problemlos als JSON-Struktur einbetten erwartet:
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` }
Wenn die eingebettete Struktur jedoch über eine benutzerdefinierte MarshalJSON()-Methode verfügt, ist dies der Fall unterbricht den Marshalling-Prozess:
func (p *Person) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(p.Name), }) }
Dies liegt daran, dass die eingebettete Person-Struktur die MarshalJSON()-Funktion implementiert, die Vorrang vor der eigenen MarshalJSON()-Methode der Employee-Struktur hat.
Die gewünschte Ausgabe besteht darin, die Mitarbeiterfelder normal zu codieren und sich dabei auf die MarshalJSON()-Methode der Person zu verlassen, um deren Felder zu marsalieren. Das Hinzufügen einer MarshalJSON()-Methode zu Employee erfordert jedoch das Wissen, dass der eingebettete Typ auch MarshalJSON() implementiert, was fragil sein kann.
Um dieses Problem zu lösen, können wir einen anderen Ansatz verwenden:
Erstellen Sie einen neuen Typnamen, um den Namen der Person darzustellen Name:
type Name string
Implementieren Sie MarshalJSON() auf Name, um dessen Kodierung anzupassen:
func (n Name) MarshalJSON() ([]byte, error) { return json.Marshal(strings.ToUpper(string(n))) }
Ändern Sie die Personenstruktur, um Name zu verwenden anstelle von Zeichenfolge:
type Person struct { Name Name `json:"name"` }
Dieser Ansatz ermöglicht es uns, die Codierung von anzupassen der Name der Person, ohne dass eine MarshalJSON()-Methode für die Employee-Struktur erforderlich ist.
Wenn wir dies alternativ allgemeiner implementieren möchten, müssen wir MarshalJSON für den äußeren Typ implementieren. Methoden des inneren Typs werden zum äußeren Typ heraufgestuft, sodass wir die MarshalJSON-Methode des inneren Typs aufrufen, ihre Ausgabe in eine generische Struktur wie „map[string]interface{} entmarshalieren und unsere eigenen Felder hinzufügen können. Dies kann jedoch den Nebeneffekt haben, dass sich die Reihenfolge der endgültigen Ausgabefelder ändert.
Das obige ist der detaillierte Inhalt vonWie bette ich Strukturen mit benutzerdefinierten „MarshalJSON()'-Methoden idiomatisch in Go ein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!