小编典典

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

go

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


阅读 1124

收藏
2020-07-02

共1个答案

小编典典

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

因此,更好的经验法则是:

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

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

2020-07-02