json - Go:JSON 输入意外结束,json.Unmarshal 返回 nil 值

标签 json go unmarshalling

我正在测试如何从我正在使用的 API 中解码 json 响应。

json 看起来像下面这样;

body := []byte(`[
    {"name":"Name1", "value":100.00},
    {"name":"Name2", "value":200.00}
]`)

我已经四处寻找各种方法来做到这一点,但未能使其发挥作用。解码返回零值。我还收到错误“JSON 输入的意外结束”(我已经删除了示例中的错误处理)。

完整代码示例 - https://play.golang.org/p/VMdWuAm6HS

引用:

  1. https://godoc.org/encoding/json#RawMessage
  2. Golang json Unmarshal "unexpected end of JSON input"
  3. How to unmarshal json into interface{} in golang?

最佳答案

您的输入 JSON 可以用一个简单的 []Obj 建模,其中 Obj 是您的类型:

type Obj struct {
    Name  string  `json:"name"`
    Value float32 `json:"value"`
}

真的不需要别的了,真的:

body := []byte(`[
    {"name":"Name1", "value":100.00},
    {"name":"Name2", "value":200.00}]`)

var res []Obj
err := json.Unmarshal(body, &res)
fmt.Printf("%#v\n%v\n", res, err)

输出包含来自输​​入 JSON 的数据(在 Go Playground 上尝试):

[]main.Obj{main.Obj{Name:"Name1", Value:100}, main.Obj{Name:"Name2", Value:200}}
<nil>

回到您的代码:

你出错的地方是你使用了这个模型:

type Obj struct {
    Name string `json:"name"`
    Value float32 `json:"value"`
}

type Result struct {
    Data json.RawMessage
}

var res []Result

但是这个 res 变量将模拟以下 JSON:

[
    {"Data":{"name":"Name1", "value":100.00}},
    {"Data":{"name":"Name2", "value":200.00}}
]

我想您可以看出区别:此处数组的元素是带有 “数据” 字段的 JSON 对象,然后使用您的 Obj 对其进行建模。然后使用您的原始解析代码正确解析此输入 JSON,您可以在 Go Playground 上尝试:

[{{"name":"Name1", "value":100.00}} {{"name":"Name2", "value":200.00}}] 
&main.Obj{Name:"Name1", Value:100} 
&main.Obj{Name:"Name2", Value:200}

关于json - Go:JSON 输入意外结束,json.Unmarshal 返回 nil 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950224/

相关文章:

java - 将 Xml 转换为 Java Bean - Map 和 Tags 属性的问题

javascript - 合并 2 个对象数组以创建对象映射

ios - 以前的 NSDictionary 现在到 JSON 数组

google-app-engine - 如何为 Golang 和 AppEngine 设置 VScode 调试 session ?

json - 我的结构没有编码为 json

java - 来自以 UTF-8 编码的 Java 解码文件的错误字符

javascript - 从响应中获取 json 值

json - 如何解码多种类型的嵌套数组?

regex - golang 中嵌套组的正则表达式问题

datetime - 如何清空 SOAP Web 服务中的日期时间字段?