Heim > Backend-Entwicklung > Golang > Wie füge ich beliebige Felder zur JSON-Ausgabe einer unbekannten Struktur in Go hinzu?

Wie füge ich beliebige Felder zur JSON-Ausgabe einer unbekannten Struktur in Go hinzu?

Linda Hamilton
Freigeben: 2024-12-29 17:47:10
Original
431 Leute haben es durchsucht

How to Add Arbitrary Fields to the JSON Output of an Unknown Struct in Go?

Hinzufügen beliebiger Felder zur JSON-Ausgabe einer unbekannten Struktur

Einführung

Das Einbetten von Strukturen als anonyme Abschlüsse ist ein gängiger Ansatz zum Hinzufügen zusätzlicher Felder zu JSON Ausgänge. Diese Technik ist jedoch auf Situationen beschränkt, in denen der Strukturtyp bekannt ist.

Das Problem: Einbetten unbekannter Typen

Beim Umgang mit beliebigen Strukturen oder Schnittstellen schlägt der herkömmliche Einbettungsansatz fehl. Betrachten Sie den folgenden Code:

type example interface{}
type Data struct {
    Name string
}

type Extra struct {
    Text string
}

func printInterface(val interface{})    {
    example1 := struct {
        example
        Extra string
    }{
        example: val,
        Extra: "text",
    }
    json.NewEncoder(os.Stdout).Encode(example1)
}

func main() {
    d := Data{Name:"name"}
    printInterface(&d)
}
Nach dem Login kopieren

Dieser Code erzeugt die folgende JSON-Ausgabe:

{"example":{"Name":"name"},"Extra":"text"}
Nach dem Login kopieren

Wie Sie sehen können, ist das Feld „Name“ der Datenstruktur nicht in der JSON-Ausgabe enthalten . Dies liegt daran, dass Schnittstellen keine Felder haben und daher die Felder der zugrunde liegenden Struktur nicht hochgestuft werden.

Dynamisches Generieren eines Strukturtyps

Eine Lösung besteht darin, mithilfe von Reflektion dynamisch einen neuen Strukturtyp zu generieren . Diese Struktur enthält ein anonymes Feld des unbekannten Typs und ein zusätzliches Feld für die zusätzlichen Daten.

func printInterface(val interface{}) {
    t2 := reflect.StructOf([]reflect.StructField{
        reflect.StructField{
            Name:      "X",
            Anonymous: true,
            Type:      reflect.TypeOf(val),
        },
        reflect.StructField{
            Name: "Extra",
            Type: reflect.TypeOf(""),
        },
    })

    v2 := reflect.New(t2).Elem()
    v2.Field(0).Set(reflect.ValueOf(val))
    v2.FieldByName("Extra").SetString("text")

    json.NewEncoder(os.Stdout).Encode(v2.Interface())
}
Nach dem Login kopieren

Dieser Code erzeugt die gewünschte JSON-Ausgabe:

{"Name":"name","Extra":"text"}
Nach dem Login kopieren

Zweimal Marshalling

Eine andere Alternative besteht darin, den unbekannten Wert zu marsalieren, ihn in eine Karte zu entmarshallen, das zusätzliche Feld hinzuzufügen und die Karte wieder in ihn zu marsalieren JSON.

func printInterface(val interface{}) error {
    data, err := json.Marshal(val)
    if err != nil {
        return err
    }

    v2 := map[string]interface{}{}
    if err := json.Unmarshal(data, &v2); err != nil {
        return err
    }

    v2["Extra"] = "text"
    return json.NewEncoder(os.Stdout).Encode(v2)
}
Nach dem Login kopieren

Diese Lösung ist einfacher, aber aufgrund des doppelten Marshalling-Prozesses möglicherweise weniger effizient.

Das obige ist der detaillierte Inhalt vonWie füge ich beliebige Felder zur JSON-Ausgabe einer unbekannten Struktur in Go hinzu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage