为了账号安全,请及时绑定邮箱和手机立即绑定

使用 json.Unmarshal 与 json.NewDecoder.Decode 解码 JSON

使用 json.Unmarshal 与 json.NewDecoder.Decode 解码 JSON

Go
跃然一笑 2021-07-08 14:15:10
我正在开发一个 API 客户端,我需要根据请求对 JSON 有效负载进行编码,并从响应中解码 JSON 正文。我已经阅读了几个库的源代码,从我所看到的,我基本上有两种编码和解码 JSON 字符串的可能性。使用json.Unmarshal传递整个响应字符串data, err := ioutil.ReadAll(resp.Body)if err == nil && data != nil {    err = json.Unmarshal(data, value)}或使用 json.NewDecoder.Decodeerr = json.NewDecoder(resp.Body).Decode(value)就我而言,在处理实现 的 HTTP 响应时,io.Reader第二个版本似乎需要较少的代码,但由于我已经看过两者,我想知道是否应该使用解决方案而不是其他解决方案有任何偏好。此外,这个问题的公认答案说请使用json.Decoder代替json.Unmarshal。但它没有提到原因。我真的应该避免使用json.Unmarshal吗?
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

这真的取决于你的输入是什么。如果您查看Decode方法的实现json.Decoder,它会在将整个 JSON 值解组为 Go 值之前缓冲内存中的整个 JSON 值。因此,在大多数情况下,它的内存效率不会更高(尽管在该语言的未来版本中这很容易改变)。

所以一个更好的经验法则是这样的:

  • 使用json.Decoder,如果你的数据从一个即将io.Reader流,或者需要多个值,从数据流进行解码。

  • json.Unmarshal如果内存中已有 JSON 数据,请使用。

对于从 HTTP 请求读取的情况,我会选择,json.Decoder因为您显然是从流中读取。


查看完整回答
反对 回复 2021-07-19
  • 1 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信