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