问题概述
向 JSON 输出添加任意字段可以通过扩展匿名已知结构。然而,这种方法在处理未知的结构或接口时受到限制。本文探讨了这一挑战的解决方案。
解决方案 1:使用反射生成动态类型
一个解决方案涉及使用 Reflect 包在运行时生成动态类型。这个新类型是一个结构体,具有包装接口类型的匿名字段和用于额外值的附加字段。通过反映该值并相应地设置字段,我们可以获得所需的 JSON 输出。
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()) }
解决方案 2:编组和解组
或者,我们可以将值编组为 JSON,将其解组到映射中,添加额外字段,然后编组结果
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) }
解决方案比较
基于反射的解决方案专门针对给定接口生成新类型,从而产生更定制且可能更快的方法。编组和解编组解决方案更简单,但由于额外的编组步骤而速度较慢。在后一种方法中,JSON 输出中的字段顺序也可能有所不同。
以上是如何在 Go 中使用未知结构扩展 JSON 输出?的详细内容。更多信息请关注PHP中文网其他相关文章!