Erweitern unbekannter Strukturen mit beliebigen JSON-Feldern
In Go kann das Hinzufügen zusätzlicher Felder zu einer JSON-Darstellung einer bekannten Struktur mithilfe von erreicht werden anonyme Struktur. Dieser Ansatz ist jedoch nicht anwendbar, wenn es um unbekannte Strukturen geht. In diesem Artikel wird untersucht, wie in solchen Szenarien eine ähnliche Funktionalität erreicht werden kann.
Reflect-Paket für die dynamische Typgenerierung
Eine Lösung besteht darin, das Reflect-Paket für die dynamische Generierung einer benutzerdefinierten Struktur zu verwenden zur Laufzeit eingeben. Dieser Typ umfasst ein anonymes Feld desselben Typs wie die umschlossene Schnittstelle und ein zusätzliches „Extra“-Feld. Dies ermöglicht die Heraufstufung der Felder der eingebetteten Struktur und ermöglicht so eine ordnungsgemäße JSON-Darstellung.
func printInterface(val interface{}) { // Define the new struct type dynamically t2 := reflect.StructOf([]reflect.StructField{ { Name: "X", Anonymous: true, Type: reflect.TypeOf(val), }, { Name: "Extra", Type: reflect.TypeOf(""), }, }) // Create a new instance of the dynamic type v2 := reflect.New(t2).Elem() v2.Field(0).Set(reflect.ValueOf(val)) v2.FieldByName("Extra").SetString("text") // Encode the dynamic type's value to JSON json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
Doppeltes Marshalling für beliebige JSON-Felder
Ein alternativer Ansatz beinhaltet die Serialisierung der Schnittstelle. Parsen des resultierenden JSON in eine Karte, Hinzufügen des Felds „Extra“ und erneutes Serialisieren der geänderten Karte in JSON. Diese Methode ist einfacher, kann jedoch aufgrund mehrerer Serialisierungsschritte zu Leistungseinbußen führen.
func printInterface(val interface{}) error { // Serialize the interface to JSON data, err := json.Marshal(val) if err != nil { return err } // Unmarshal the JSON into a map v2 := map[string]interface{}{} if err := json.Unmarshal(data, &v2); err != nil { return err } // Add the "Extra" field to the map v2["Extra"] = "text" // Serialize the modified map to JSON return json.NewEncoder(os.Stdout).Encode(v2) }
Beide Methoden erweitern effektiv unbekannte Strukturen um das gewünschte „Extra“-Feld in der JSON-Darstellung und sind für Szenarien geeignet, in denen eine direkte Strukturmanipulation erforderlich ist ist nicht machbar.
Das obige ist der detaillierte Inhalt vonWie erweitere ich unbekannte Go-Strukturen mit beliebigen JSON-Feldern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!