首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用json.Unmarshal与json.NewDecoder.Decode解码JSON

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

Stack Overflow用户
提问于 2014-01-18 06:34:56
回答 2查看 82.6K关注 0票数 256

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

我已经阅读了几个库中的源代码,从我所看到的情况来看,我基本上有两种编码和解码JSON字符串的可能性。

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

代码语言:javascript
复制
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
    err = json.Unmarshal(data, value)
}

或者使用json.NewDecoder.Decode

代码语言:javascript
复制
err = json.NewDecoder(resp.Body).Decode(value)

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

此外,the accepted answer from this question

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-18 08:41:00

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

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

如果数据来自io.Reader流,或者需要对数据流中的多个值进行解码,则使用json.Decoder。如果内存中已有io.Reader数据,则

  • 使用json.Unmarshal

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

票数 305
EN

Stack Overflow用户

发布于 2021-08-06 02:23:02

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

那么我们什么时候使用解码器而不是解组呢?

这取决于输入。如果您的数据来自io.Reader流,如http.Request的正文,请使用解码器。如果数据在字符串中或内存中的某个位置,请使用Unmarshal。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21197239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档