json - 使用 json.Unmarshal 与 json.NewDecoder.Decode

我正在开发一个 API 客户端,我需要根据请求对 JSON 有效负载进行编码并从响应中解码 JSON 正文。

我已经阅读了几个库的源代码,根据我所见,我基本上有两种可能对 JSON 字符串进行编码和解码。

使用 json.Unmarshal传递整个响应字符串

data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
    err = json.Unmarshal(data, value)
}

或使用 json.NewDecoder.Decode

err = json.NewDecoder(resp.Body).Decode(value)

在我的情况下,在处理实现 io.Reader 的 HTTP 响应时,第二个版本似乎需要更少的代码,但是由于我已经看到了这两个版本,我想知道是否有任何偏好我应该使用一个解决方案而不是另一个。

此外,the accepted answer from this question说

Please use json.Decoder instead of json.Unmarshal.

但它没有提到原因。我真的应该避免使用 json.Unmarshal 吗?

最佳答案

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

所以更好的经验法则是:

  • 如果您的数据来自 io.Reader 流,或者您需要从数据流中解码多个值,请使用 json.Decoder
  • 如果内存中已有 JSON 数据,请使用 json.Unmarshal

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

关于json - 使用 json.Unmarshal 与 json.NewDecoder.Decode 解码 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21197239/

相关文章:

ios - Swift 3 URLSession.shared() 对成员 'dataTask(wi

ajax - POST JSON 失败,出现 415 Unsupported media type,

json - 使用 Swift 读取 JSON 文件

python - 如何将字典转储到 JSON 文件?

javascript - 错误 "Uncaught SyntaxError: Unexpected

json - 如何在 Node.js 中记录 JSON 对象的内容?

javascript - 使用 Node.js 在 JSON 文件中写入/添加数据

json - 使用jq依次解析并显示一个json中的多个字段

json - 在 mongodb 中使用 ISODate 进行日期查询似乎不起作用

json - 你如何表示一个 JSON 字符串数组?