【问题标题】:Go: unexpected end of JSON input and json.Unmarshal returns nil valuesGo:JSON 输入的意外结束和 json.Unmarshal 返回 nil 值
【发布时间】:2016-12-03 17:01:00
【问题描述】:

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

json 如下所示;

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

我已经四处寻找各种方法来做到这一点,但无法让它发挥作用。解组返回零值。我还收到错误“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 go unmarshalling


    【解决方案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}
    

    【讨论】:

    • 感谢您的快速回复!
    猜你喜欢
    • 2020-11-18
    • 2021-06-23
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2016-08-05
    • 2018-01-23
    • 2020-07-10
    相关资源
    最近更新 更多