使用JSON解码JSON。Unmarshal vs json. newdecode

我正在开发一个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响应时,第二个版本似乎需要更少的代码,但由于我已经看到了这两个版本,我想知道是否有任何偏好,我是否应该使用一个解决方案而不是另一个。

此外,这个问题的公认答案

请使用json.Decoder代替json.Unmarshal

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

100685 次浏览

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

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

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

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

我在Go web编程书中找到了这段话。但是没有给出解释

我们什么时候使用解码器和Unmarshal?

这取决于输入。如果你的数据来自io。读者 流,就像http的正文。请求,使用解码器。如果你有

.

.