Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich Marshall-JSON-Strukturen in Go mit anonymen Mitgliedern reduzieren?

Wie kann ich Marshall-JSON-Strukturen in Go mit anonymen Mitgliedern reduzieren?

Susan Sarandon
Susan SarandonOriginal
2024-11-02 18:21:30414Durchsuche

How to flatten Marshalled JSON Structs in Go with anonymous members?

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!

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