Home >Backend Development >Golang >How to Extend Unknown Go Structs with Arbitrary JSON Fields?
Extending Unknown Structs with Arbitrary JSON Fields
In Go, adding additional fields to a JSON representation of a known struct can be achieved using an anonymous struct. However, this approach is not applicable when dealing with unknown structs. This article explores how to achieve similar functionality in such scenarios.
Reflect package for Dynamic Type Generation
One solution is to utilize the reflect package for dynamically generating a custom struct type at runtime. This type includes an anonymous field of the same type as the wrapped interface and an additional "Extra" field. This allows the promotion of the embedded struct's fields, enabling proper JSON representation.
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()) }
Double Marshalling for Arbitrary JSON Fields
An alternative approach involves serializing the interface, parsing the resulting JSON into a map, adding the "Extra" field, and then re-serializing the modified map to JSON. This method is simpler but may incur a performance penalty due to multiple serialization steps.
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) }
Both methods effectively extend unknown structs with the desired "Extra" field in the JSON representation, catering to scenarios where direct struct manipulation is not feasible.
The above is the detailed content of How to Extend Unknown Go Structs with Arbitrary JSON Fields?. For more information, please follow other related articles on the PHP Chinese website!