将 JSON 解组为结构体与接口
在 Go 中,encoding/json 包提供了将 JSON 数据与 Go 值相互转换的功能。将 JSON 解组为结构时,重要的是要了解包需要有关目标类型的显式指令。
默认情况下,将 JSON 解组为接口时,包会根据数据结构选择适当的类型。对于 JSON 对象,它选择 map[string]interface{},对于 JSON 数组,它选择 []interface{}。但是,在处理结构时,这种行为有所不同。
要将 JSON 解组为特定结构,您需要将指向该结构的指针作为 json.Unmarshal() 的第二个参数传递。这是因为 Go 在将指针传递给函数时会自动取消引用指针。
但是,如果您尝试将 JSON 解组到包含非指针结构体值的 interface{} 变量中,则包无法确定预期的值目标类型。相反,它会将数据解释为映射或切片,具体取决于其结构。
要解决此问题,您应该使用指针引用将结构体值包装在 interface{} 中。这确保 json.Unmarshal 具有解组为适当类型所需的信息:
func getFoo() interface{} { return &Foo{"bar"} // Use a pointer wrapper }
这是示例代码的改进版本:
package main import ( "encoding/json" "fmt" ) type Foo struct { Bar string `json:"bar"` } func getFoo() interface{} { return &Foo{"bar"} } func main() { fooInterface := getFoo() myJSON := `{"bar":"This is the new value of bar"}` jsonBytes := []byte(myJSON) err := json.Unmarshal(jsonBytes, fooInterface ) if err != nil { fmt.Println(err) } fmt.Printf("%T %+v", fooInterface, fooInterface) }
此更新的代码将成功打印具有更新的“bar”值的未编组的 Foo 结构。
以上是Go JSON 解组:结构与接口 – 何时使用指针?的详细内容。更多信息请关注PHP中文网其他相关文章!