Wie kann ich Marshall-JSON-Strukturen in Go mit anonymen Mitgliedern reduzieren?

Susan Sarandon
Freigeben: 2024-11-02 18:21:30
Original
490 Leute haben es durchsucht

How to flatten Marshalled JSON Structs in Go with anonymous members?

Abflachen von Marshalled-JSON-Strukturen mit anonymen Mitgliedern in Go

Im folgenden Code:

<code class="go">type Anything interface{}

type Hateoas struct {
    Anything
    Links map[string]string `json:"_links"`
}

func MarshalHateoas(subject interface{}) ([]byte, error) {
    h := &Hateoas{subject, make(map[string]string)}
    switch s := subject.(type) {
    case *User:
        h.Links["self"] = fmt.Sprintf("http://user/%d", s.Id)
    case *Session:
        h.Links["self"] = fmt.Sprintf("http://session/%d", s.Id)
    }
    return json.MarshalIndent(h, "", "    ")
}</code>
Nach dem Login kopieren

das Ziel ist um JSON so zu marsalieren, dass das anonyme Mitglied abgeflacht wird. Standardmäßig wird das anonyme Mitglied als separates benanntes Feld in der JSON-Ausgabe behandelt.

Die Lösung hierfür besteht darin, das Reflect-Paket zu verwenden, um die Felder der Struktur, die wir serialisieren möchten, manuell einer Karte zuzuordnen[ string]interface{}. Auf diese Weise können wir die flache Struktur der ursprünglichen Struktur beibehalten, ohne neue Felder einzuführen.

Hier ist der Code, der dies erreicht:

<code class="go">func MarshalHateoas(subject interface{}) ([]byte, error) {
    links := make(map[string]string)
    out := make(map[string]interface{})
    subjectValue := reflect.Indirect(reflect.ValueOf(subject))
    subjectType := subjectValue.Type()
    for i := 0; i < subjectType.NumField(); i++ {
        field := subjectType.Field(i)
        name := subjectType.Field(i).Name
        out[field.Tag.Get("json")] = subjectValue.FieldByName(name).Interface()
    }
    switch s := subject.(type) {
    case *User:
        links["self"] = fmt.Sprintf("http://user/%d", s.Id)
    case *Session:
        links["self"] = fmt.Sprintf("http://session/%d", s.Id)
    }
    out["_links"] = links
    return json.MarshalIndent(out, "", "    ")
}</code>
Nach dem Login kopieren

Dieser Code iteriert über die Felder der Struktur , ruft ihre Werte ab und fügt sie der Ausgabezuordnung hinzu, wobei das JSON-Tag des Felds als Schlüssel verwendet wird. Dieser Prozess stellt sicher, dass die Felder des anonymen Mitglieds in der Ausgabezuordnung abgeflacht werden.

Indem wir den JSON-Marshalling-Prozess auf diese Weise anpassen, können wir die gewünschte JSON-Ausgabe erzielen und gleichzeitig die Flexibilität und Typsicherheit einer Schnittstelle beibehalten.

Das obige ist der detaillierte Inhalt vonWie kann ich Marshall-JSON-Strukturen in Go mit anonymen Mitgliedern reduzieren?. 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