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

时间:2016-12-03 17:01:01

标签: json go unmarshalling

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

json看起来如下;

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

我已经四处寻找各种方法来做到这一点,但未能让它发挥作用。 unmarshal返回零值。我也收到错误" 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?

1 个答案:

答案 0 :(得分:1)

您的输入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}}
]

我认为您可以看到差异:此处数组的元素是带有"Data"字段的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}