Heim > Backend-Entwicklung > Golang > Wie bette ich Strukturen mit benutzerdefinierten „MarshalJSON()'-Methoden idiomatisch in Go ein?

Wie bette ich Strukturen mit benutzerdefinierten „MarshalJSON()'-Methoden idiomatisch in Go ein?

Susan Sarandon
Freigeben: 2024-12-13 18:45:11
Original
449 Leute haben es durchsucht

How to Embed Structs with Custom `MarshalJSON()` Methods Idiomatically in Go?

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

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

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:

  1. Erstellen Sie einen neuen Typnamen, um den Namen der Person darzustellen Name:

    type Name string
    Nach dem Login kopieren
  2. Implementieren Sie MarshalJSON() auf Name, um dessen Kodierung anzupassen:

    func (n Name) MarshalJSON() ([]byte, error) {
     return json.Marshal(strings.ToUpper(string(n)))
    }
    Nach dem Login kopieren
  3. Ändern Sie die Personenstruktur, um Name zu verwenden anstelle von Zeichenfolge:

    type Person struct {
     Name Name `json:"name"`
    }
    Nach dem Login kopieren

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!

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