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.
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>
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.
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>
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!