首页  >  文章  >  后端开发  >  如何使用 Go 中的接口变量将 JSON 解组为特定结构?

如何使用 Go 中的接口变量将 JSON 解组为特定结构?

Susan Sarandon
Susan Sarandon原创
2024-11-27 16:58:11495浏览

How to Unmarshal JSON into a Specific Struct Using an Interface Variable in Go?

如何使用接口变量将 JSON 解组为特定结构

问题:

何时将 JSON 解组为接口变量,encoding/json 包将其解释为映射。我们如何指示它使用特定的结构?

解释:

JSON 包在解组时需要一个具体类型作为目标。传递interface{}变量并不能提供足够的信息,包默认为对象使用map[string]interface{},为数组默认使用[]interface{}。

解决方案:

没有内置方法告诉 json.Unmarshal 使用接口变量将其解组为具体的结构类型。但是,有一个解决方法:

  1. 将指针包装到接口变量中所需的结构。
func getFoo() interface{} {
    return &Foo{"bar"}
}
  1. 将包装的指针传递给 json。解组。
err := json.Unmarshal(jsonBytes, fooInterface)
  1. 访问通过接口变量解组数据。
fmt.Printf("%T %+v", fooInterface, fooInterface)

示例:

以下代码演示了该技术:

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) // prints: *main.Foo &{Bar:This is the new value of bar}
}

以上是如何使用 Go 中的接口变量将 JSON 解组为特定结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn