Heim >Backend-Entwicklung >Golang >Wie kann ich der JSON-Ausgabe für unbekannte Go-Strukturen beliebige Felder hinzufügen?

Wie kann ich der JSON-Ausgabe für unbekannte Go-Strukturen beliebige Felder hinzufügen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-16 06:10:10704Durchsuche

How Can I Add Arbitrary Fields to JSON Output for Unknown Go Structs?

Erweitern der JSON-Ausgabe für unbekannte Strukturen

Problem:

Beim Umgang mit unbekannten Strukturen oder Schnittstellen das Hinzufügen beliebiger Felder zu Die JSON-Ausgabe kann eine Herausforderung sein. Der vorgeführte Code veranschaulicht dieses Problem. Wie können wir die gewünschte JSON-Ausgabe für unbekannte Strukturen replizieren?

Lösung 1: Dynamische Typgenerierung mithilfe von Reflection

Ein Ansatz besteht darin, mithilfe von Reflection zur Laufzeit einen dynamischen Typ zu generieren . Dieser Typ ist eine Struktur mit einem anonymen Feld des umschlossenen Schnittstellentyps und einem zusätzlichen Feld. Durch die Manipulation dieses dynamischen Typs können wir die gewünschte JSON-Ausgabe erzielen.

func printInterface(val interface{}) {
    t2 := reflect.StructOf([]reflect.StructField{
        {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)},
        {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())
}

Lösung 2: Marshal-Unmarshal-Marshal

Eine alternative Lösung besteht im Marshalling der Eingabe Wert, Unmarshalling in einer Karte, Hinzufügen des zusätzlichen Felds und Marshalling noch einmal.

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)
}

Beide Lösungen ermöglichen es uns, beliebige Felder zur JSON-Ausgabe für unbekannte Strukturen hinzuzufügen. Die erste Lösung ist anspruchsvoller und bietet eine bessere Kontrolle, während die zweite Lösung einfacher, aber aufgrund des Dual-Marshallings weniger leistungsfähig ist. Letztendlich hängt die Wahl der Lösung von den spezifischen Anforderungen und Prioritäten des Anwendungsfalls ab.

Das obige ist der detaillierte Inhalt vonWie kann ich der JSON-Ausgabe für unbekannte Go-Strukturen beliebige Felder hinzufügen?. 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