Wie kann man gemarshallte JSON-Strukturen mit anonymen Mitgliedern in Go reduzieren?

Barbara Streisand
Freigeben: 2024-10-29 07:35:31
Original
216 Leute haben es durchsucht

How to Flatten Marshaled JSON Structs with Anonymous Members in Go?

Reduzierung gemarshallter JSON-Strukturen mit anonymen Mitgliedern in Go

Beim Marshalling von JSON-Daten in Go können anonyme Mitglieder zu unerwarteten Komplexitäten führen. Dieser Artikel befasst sich mit einer Lösung, die diese Herausforderungen angeht.

Das Problem

Beachten Sie den folgenden Code:

<code class="go">type Hateoas struct {
    Anything
    Links map[string]string `json:"_links"`
}</code>
Nach dem Login kopieren

Wenn Hateoas anonyme Mitglieder enthält, werden sie vom JSON-Marshaler behandelt als reguläre benannte Felder, was zu unerwünschter Verschachtelung führt:

<code class="json">{
    "Anything": {
        "id": 123,
        "name": "James Dean"
    },
    "_links": {
        "self": "http://user/123"
    }
}</code>
Nach dem Login kopieren

Lösung: Reflection-Based Flattening

Um die JSON-Struktur zu verflachen und die zusätzliche Verschachtelung zu beseitigen, können wir Reflection verwenden:

<code class="go">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()
}</code>
Nach dem Login kopieren

Diese Schleife durchläuft die Felder der Struktur, extrahiert ihre JSON-Tag-Namen und ordnet sie einer abgeflachten Map[string]-Schnittstelle{} zu. Durch die Verwendung von Reflektion vermeiden wir das Hinzufügen neuer benannter Felder und behalten die ursprüngliche flache Struktur bei.

Beispiel

Hier ist ein Beispiel für die Verwendung dieser Lösung:

<code class="go">import "reflect"

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

Mit Mit dieser verbesserten MarshalHateoas-Funktion wird die Beispiel-JSON-Ausgabe zu:

<code class="json">{
    "id": 123,
    "name": "James Dean",
    "_links": {
        "self": "http://user/123"
    }
}</code>
Nach dem Login kopieren

Schlussfolgerung

Durch die Nutzung von Reflektion können wir JSON-Strukturen mit anonymen Mitgliedern effektiv reduzieren und die gewünschte JSON-Struktur erreichen, ohne die Datenintegrität zu beeinträchtigen . Diese Lösung bietet eine robuste Möglichkeit, komplexe JSON-Serialisierungsszenarien in Go zu bewältigen.

Das obige ist der detaillierte Inhalt vonWie kann man gemarshallte JSON-Strukturen mit anonymen Mitgliedern in Go 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