当前位置: 首页 > 面试题库 >

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

沈永贞
2023-03-14
问题内容

我正在开发一个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,则它将整个JSON值缓冲在内存中,然后再将其解组为Go值。因此,在大多数情况下,内存效率不会更高(尽管在将来的语言版本中很容易改变)。

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

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

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



 类似资料:
  • 问题内容: 这个来自json.Unmarshal docs的示例(为便于使用而不是进行了稍微修改)有效,没有错误: 工作示例的游乐场链接 但是这个经过稍微修改的示例却没有: 非工作示例的游乐场链接 它显示了这个实际上并没有帮助的模糊错误(看起来更像是一个函数调用,而不是错误的IMO): json:Unmarshal(nil * main.Animal) 这似乎是因为它是未初始化的指针。但是文档说(

  • 问题内容: 我想编写一个函数,该函数接收 几种 类型的结构并从JSON解组。为此,我有另一组带有预定义签名的函数,这些函数返回struct实例,但是由于每个函数都返回不同类型的struct,因此函数签名具有的返回类型。 当我发送json.Unmarshal一个具体的结构时,它可以按照我的预期工作,但是当我发送相同的结构时,它将其转换为地图。 这是描述问题的简化示例代码: https://play.

  • 问题内容: 我有一个用于ERP系统的快速开发工具,该工具仅允许使用vbscript。我正在尝试使用VBS创建一个简单的AJAX请求。可以使用“ Microsoft.XMLHTTP”对象。 下一步是使用json从网络服务器接收数据。但是在VBS中似乎没有像“ json_decode”或其他功能。 有人知道解决方案吗?还是开发自己的json函数的唯一选择? 问题答案: 由于JSON是一种分层数据格式,

  • 问题内容: 我有一个看起来像这样的JSON Blob 我有一些代码将其转换回go结构 但是我在运行时看到的只是一个零位结构 我尝试先分配该结构,但那也没有用,我不确定为什么它不产生值,并且不返回错误 问题答案: 您的结构字段不会导出。这是因为它们以小写字母开头。 当我说“未导出”时,是指它们在您的包装之外不可见。您的软件包可以愉快地访问它们,因为它们在本地作用域内。 至于包装-它看不到它们。您需要

  • 1.问题现象描述 使用 json.Unmarshal(),反序列化时,出现了科学计数法,参考代码如下: jsonStr := `{"number":1234567}` result := make(map[string]interface{}) err := json.Unmarshal([]byte(jsonStr), &result) if err != nil { fmt.Print

  • 本文向大家介绍Go JSON编码与解码的实现,包括了Go JSON编码与解码的实现的使用技巧和注意事项,需要的朋友参考一下 在开发应用程序时,客户端(前端页面或APP)与服务端交互是在所难免的,在交互过程传递数据时,最通用和流行格式便是JSON,Go语言提供了encoding/json包,用于处理JSON数据的编码与解码。 除了JSON,XML也常用于前后端的数据交互,不过由于简洁性、可读性和流行