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

I am working on some code to parse the JSON data from an HTTP response. The code I have looks something like this:

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

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

The json in the respBytes variable looks like this:

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

However, err is not nil. When I print it out it says unexpected end of JSON input. What is causing this? The JSON seems to valid. Does this error have something to do with my custom struct?

Thanks in advance!

dongming0505
dongming0505 respBytes只是字节数组(我接受响应,进行一些处理并提取主体)。我还在ResultStruct中将结果字段大写。您的GoPlayground示例采用了我收到的JSON并正确处理了它,因此我的代码肯定存在其他问题……感谢您的帮助!
5 年多之前 回复
douxunchen3498
douxunchen3498 另外,请注意,小写表示私有可见性。您希望大写ResultStruct中的字段名称:否则json解码器不允许触摸该字段。请参阅:play.golang.org/p/bATT5uMPRT,以获取有效的示例。因此,我们需要更多信息来查看您的错误是什么:陈述的问题不足以说明。
5 年多之前 回复
douniangliao4327
douniangliao4327 您如何读入respBytes?
5 年多之前 回复

2个回答

The unexpected end of JSON input is the result of a syntax error in the JSON input (likely a missing ", }, or ]). The error does not depend on the type of the value that you are decoding to.

I ran the code with the example JSON input on the playground. It runs without error.

The code does not decode anything because the result field is not exported. If you export the result field:

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

then the input is decoded as shown in this playground example.

I suspect that you are not reading the entire response body in your application. I suggest decoding the JSON input using:

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

The decoder reads directly from the response body.

doubo1883
doubo1883 是的...我正在从一个空的缓冲区中读取...
5 年多之前 回复
dongtuo5262
dongtuo5262 这是有道理的,但是我打印出了JSON并通过在线验证程序以及@dyoo的Go park示例运行了它,并成功了。 我必须得出结论,此错误是由于我的代码另一部分出现问题所致。 谢谢!
5 年多之前 回复
dongquxiao8545
dongquxiao8545 我怀疑除了@ 3of3所说的以外,您还尝试分析不带最后一个'}'字符的JSON。
5 年多之前 回复

You can also get this error if you're using json.RawMessage in an unexported field. For example, the following code produces the same error:

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)
}

If you export "MyJson.bar" field (e.g. -> "MyJson.Bar", then the code works.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问