转: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

参考:

  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,其中建模是你的类型:

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} 
+0

感谢您的快速响应! – multiversed