如何用json.解编组对json.NewDecoder.Decode在Golang中解码JSON?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我正在开发一个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)

在我的情况下,当处理实现的HTTP响应时,io.Reader第二个版本似乎需要更少的代码,但是因为我已经看到了两者,我想知道是否应该使用解决方案而不是其他方案。

此外,从这个问题接受的答案

请使用,json.Decoder而不是json.Unmarshal

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

提问于
用户回答回答于

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

所以更好的经验法则是:

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

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

用户回答回答于

我们必须在解码之前从管道获取[]字节,因此在处理HTTP连接时需要从io读取数据,所以我认为这两个函数是相同的。但是当数据保存在内存中,或者我们已经得到[]字节时,我们可以Unmarshal直接使用,这样会更好。

json.Decoder读取和写入HTTP连接的WebSockets,或文件时使用。

json.Unmarshal当输入[]字节用于

扫码关注云+社区