首页 > 后端开发 > Golang > ## 为什么 `json.Unmarshal` 在解组到接口{}时返回映射而不是结构?

## 为什么 `json.Unmarshal` 在解组到接口{}时返回映射而不是结构?

Susan Sarandon
发布: 2024-10-26 06:24:02
原创
324 人浏览过

## Why does `json.Unmarshal` return a map instead of a struct when unmarshaling into an interface{}?

JSON 编组接口的异常返回类型

在使用 json.Unmarshal 将字节数组转换为接口{}的场景中,当返回映射而不是预期的结构类型时,可能会出现意外结果。这种差异可以归因于interface{}类型的抽象性质,使得json包无法辨别底层结构结构。

要纠正这种异常,建议显式传递指向所需的指针struct,将其转换为抽象接口。这种方法允许 json 包相应地识别和反序列化结构。

例如,以下修改后的代码片段说明了所需的行为:

<code class="go">func bad() {
    var ping interface{} = &Ping{} // Pass a pointer to Ping as an interface
    deserialize([]byte(`{"id":42}`), ping)
    fmt.Println("DONE:", ping) // Now outputs a Ping struct
}</code>
登录后复制

或者,如果访问指针是不可行,可以利用动态分配来创建可以反序列化的新指针。然后可以使用新值更新原始 interface{} 值。

<code class="go">func bad() {
    var ping interface{} = Ping{}
    nptr := reflect.New(reflect.TypeOf(ping))
    deserialize([]byte(`{"id":42}`), nptr.Interface())
    ping = nptr.Interface()
    fmt.Println("DONE:", ping) // Outputs a Ping struct
}</code>
登录后复制

通过采用其中一种技术,json.Unmarshal 函数可以准确地将字节数组反序列化为所需的结构类型,从而消除意外的地图返回值。

以上是## 为什么 `json.Unmarshal` 在解组到接口{}时返回映射而不是结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板