Golang json Unmarshal"意外结束JSON输入"

Str*_*s3D 13 json go unmarshalling

我正在研究一些代码来解析HTTP响应中的JSON数据.我的代码看起来像这样:

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

var jsonData ResultStruct
err = json.Unmarshal(respBytes, &jsonData)
Run Code Online (Sandbox Code Playgroud)

respBytes变量中的json 看起来像这样:

{
 "result": [
  {
   "id": "ID 1"
  },
  {
   "id": "ID 2"
  }
 ]
}
Run Code Online (Sandbox Code Playgroud)

但是,err不是零.当我打印出来时,它说unexpected end of JSON input.是什么造成的?JSON似乎有效.此错误是否与我的自定义结构有关?

提前致谢!

Cer*_*món 7

所述unexpected end of JSON input的结果是一个语法错误在JSON输入(可能丢失"}])。该错误不取决于您解码到的值的类型。

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

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

type ResultStruct struct {
   Result []map[string]string
}
Run Code Online (Sandbox Code Playgroud)

然后如本示例所示对输入进行解码。

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

err := json.NewDecoder(resp.Body).Decode(&jsonData)
Run Code Online (Sandbox Code Playgroud)

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


小智 6

如果您在未导出的字段中使用 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)
}
Run Code Online (Sandbox Code Playgroud)

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

  • 它给出 **JSON 输入意外结束** 错误 (2认同)