转:JSON输入的意外结束和json.Unmarshal返回nil值
问题描述:
我测试了如何从我正在使用的API解组json响应。转:JSON输入的意外结束和json.Unmarshal返回nil值
json看起来像下面这样;
body := []byte(`[
{"name":"Name1", "value":100.00},
{"name":"Name2", "value":200.00}
]`)
我搜索周围的各种方式来做到这一点,但未能得到这个工作。 unmarshal返回零值。我还收到一个错误“JSON输入的意外结束”(我已经删除了示例中的错误处理)。
完整的代码示例 - https://play.golang.org/p/VMdWuAm6HS
参考:
答
你输入JSON可以用一个简单的[]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}
感谢您的快速响应! – multiversed