Golang json Unmarshal“JSON 输入的意外结束”

新手上路,请多包涵

我正在编写一些代码来解析来自 HTTP 响应的 JSON 数据。我的代码看起来像这样:

 type ResultStruct struct {
    result []map[string]string
}

var jsonData ResultStruct
err = json.Unmarshal(respBytes, &jsonData)

respBytes 变量中的 json 如下所示:

 {
 "result": [
  {
   "id": "ID 1"
  },
  {
   "id": "ID 2"
  }
 ]
}

但是, err 不是零。当我打印出来时,上面写着 unexpected end of JSON input 。是什么原因造成的? JSON 似乎有效。这个错误与我的自定义结构有关吗?

提前致谢!

原文由 Stratus3D 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

The unexpected end of JSON input is the result of a syntax error in the JSON input (likely a missing " , } , or ] ).该错误不取决于您要解码的值的类型。

在 playground 上 运行了带有示例 JSON 输入的代码。它运行没有错误。

该代码不解码任何内容,因为 result 字段未导出。如果导出结果字段:

 type ResultStruct struct {
   Result []map[string]string
}

然后输入被解码,如 playground example 所示。

我怀疑您没有阅读应用程序中的整个响应主体。我建议使用以下方法解码 JSON 输入:

 err := json.NewDecoder(resp.Body).Decode(&jsonData)

解码器直接从响应体中读取。

原文由 Cerise Limón 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您在未导出的字段中使用 json.RawMessage,您也可能会遇到此错误。例如,以下代码会产生相同的错误:

 package main

import (
    "encoding/json"
    "fmt"
)

type MyJson struct {
    Foo bool `json:"foo"`
    bar json.RawMessage `json:"bar"`
}

type Bar struct {
    X int `json:"x"`
}

var respBytes = []byte(`
{
  "foo": true,
  "bar": { "x": 10 }
}`)

func main() {
    var myJson MyJson
    err := json.Unmarshal(respBytes, &myJson)
    if err != nil {
        fmt.Println(err)
        return
    }
    myBar := new(Bar)
    err = json.Unmarshal(myJson.bar, myBar)
    fmt.Println(err)
}

如果导出“MyJson.bar”字段(例如 ->“MyJson.Bar”,则代码有效。

原文由 Robert 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题