Go:JSON 输入和 json.Unmarshal returns 零值的意外结束

Go: unexpected end of JSON input and json.Unmarshal returns nil values

我正在测试如何解组来自我正在使用的 API 的 json 响应。

json 看起来像下面这样;

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

我四处寻找各种方法来做到这一点,但未能使它起作用。解组 returns 零值。我还收到一个错误 "unexpected end of JSON input"(我已经删除了示例中的错误处理)。

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

参考:

  1. https://godoc.org/encoding/json#RawMessage

您的输入 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 具有 "Data" 字段的对象,然后用你的 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}