Heim >Backend-Entwicklung >Golang >Wie kann man gemarshallte JSON-Strukturen mit anonymen Mitgliedern in Go reduzieren?

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-29 07:35:31276Durchsuche

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>

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>

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>

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>

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>

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!

Stellungnahme:
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