問題概述
向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中文網其他相關文章!