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

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 05:20:30326Durchsuche

How Can I Flatten JSON Structs with Anonymous Members in Go?

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!

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