Heim >Backend-Entwicklung >Golang >Wie kann ich JSON-Strukturen mit anonymen Mitgliedern in Go reduzieren?
Abflachen von Marshalled-JSON-Strukturen mit anonymen Mitgliedern in Go
Der bereitgestellte Code versucht, Strukturen, die anonyme Mitglieder enthalten, in abgeflachte JSON-Objekte mit benutzerdefinierten „ _links"-Felder. Das anonyme Mitglied „Anything“ wird jedoch als benanntes Feld behandelt, was zu unerwünschten JSON-Strukturen führt.
Grundlegendes zur Handhabung anonymer Mitglieder beim JSON-Marshalling
Gos JSON-Marshaller Behandelt anonyme Strukturfelder so, als ob ihre inneren exportierten Felder Felder in der äußeren Struktur wären. Dieses Verhalten kann überschrieben werden, indem ein JSON-Tag mit einem Namen bereitgestellt wird, es gibt jedoch keinen expliziten Mechanismus zum Reduzieren anonymer Mitglieder.
Lösung mit Reflection
Um das Gewünschte zu erreichen Beim Abflachen nutzt die folgende Lösung das Reflect-Paket. Indem wir über die Felder der Struktur iterieren, können wir eine Map[string]-Schnittstelle{} erstellen, die die Struktur des ursprünglichen Objekts beibehält, ohne neue Felder einzuführen:
<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() } ... }</code>
Beispielverwendung
Das folgende Beispiel zeigt die abgeflachte JSON-Ausgabe für eine Benutzer- und Sitzungsstruktur:
<code class="go">package main import ( "encoding/json" "fmt" "reflect" ) type User struct { Id int `json:"id"` Name string `json:"name"` } type Session struct { Id int `json:"id"` UserId int `json:"userId"` } func MarshalHateoas(subject interface{}) ([]byte, error) { ... } func main() { u := &User{123, "James Dean"} s := &Session{456, 123} json, err := MarshalHateoas(u) if err != nil { panic(err) } else { fmt.Println("User JSON:") fmt.Println(string(json)) } json, err = MarshalHateoas(s) if err != nil { panic(err) } else { fmt.Println("Session JSON:") fmt.Println(string(json)) } }</code>
JSON-Ausgabe:
User JSON: { "id": 123, "name": "James Dean", "_links": { "self": "http://user/123" } } Session JSON: { "id": 456, "userId": 123, "_links": { "self": "http://session/456" } }
Das obige ist der detaillierte Inhalt vonWie kann ich JSON-Strukturen mit anonymen Mitgliedern in Go reduzieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!