Problemübersicht
Das Hinzufügen beliebiger Felder zur JSON-Ausgabe kann durch Erweitern von a erreicht werden Bekannte Struktur anonym. Dieser Ansatz ist jedoch begrenzt, wenn es um unbekannte Strukturen oder Schnittstellen geht. In diesem Artikel werden Lösungen für diese Herausforderung untersucht.
Lösung 1: Dynamische Typgenerierung mithilfe von Reflection
Eine Lösung besteht darin, zur Laufzeit mithilfe des Reflection-Pakets einen dynamischen Typ zu generieren. Dieser neue Typ ist eine Struktur mit einem anonymen Feld des umschlossenen Schnittstellentyps und einem zusätzlichen Feld für den zusätzlichen Wert. Indem wir über den Wert nachdenken und die Felder entsprechend festlegen, können wir die gewünschte JSON-Ausgabe erhalten.
func printInterface(val interface{}) { // Create a new struct type with anonymous field for the interface t2 := reflect.StructOf([]reflect.StructField{ {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)}, {Name: "Extra", Type: reflect.TypeOf("")}, }) // Create a new value of the dynamic type v2 := reflect.New(t2).Elem() // Set the value of the anonymous field to the input interface v2.Field(0).Set(reflect.ValueOf(val)) // Set the extra field to the desired value v2.FieldByName("Extra").SetString("text") json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
Lösung 2: Marshalling und Unmarshaling
Alternativ können wir Marshallen Sie den Wert in JSON, entmarshalieren Sie ihn in eine Karte, fügen Sie das zusätzliche Feld hinzu und Marshallen Sie das Ergebnis noch einmal.
func printInterface(val interface{}) error { // Marshal the value 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 v2["Extra"] = "text" // Marshal the map to JSON return json.NewEncoder(os.Stdout).Encode(v2) }
Vergleich von Lösungen
Die reflexionsbasierte Lösung generiert einen neuen Typ speziell für die gegebene Schnittstelle, was zu einem maßgeschneiderteren und möglicherweise schnelleren Ansatz führt . Die Marshalling- und Unmarshaling-Lösung ist einfacher, aber aufgrund des zusätzlichen Marshalling-Schritts langsamer. Auch die Reihenfolge der Felder in der JSON-Ausgabe kann bei letzterem Ansatz unterschiedlich sein.
Das obige ist der detaillierte Inhalt vonWie kann ich die JSON-Ausgabe mit unbekannten Strukturen in Go erweitern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!