我正在测试如何从我正在使用的 API 中解码 json 响应。
json 看起来像下面这样;
body := []byte(`[
{"name":"Name1", "value":100.00},
{"name":"Name2", "value":200.00}
]`)
我已经四处寻找各种方法来做到这一点,但未能使其发挥作用。解码返回零值。我还收到错误“JSON 输入的意外结束”(我已经删除了示例中的错误处理)。
完整代码示例 - https://play.golang.org/p/VMdWuAm6HS
引用:
最佳答案
您的输入 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/