繁体   English   中英

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

[英]Golang json Unmarshal "unexpected end of JSON input"

我正在编写一些代码来解析来自 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 似乎有效。 此错误与我的自定义结构有关吗?

提前致谢!

unexpected end of JSON inputunexpected end of JSON input的语法错误的结果(可能缺少"}] )。该错误与您要解码为的值的类型无关。

在操场上使用示例 JSON 输入运行代码。 它运行没有错误。

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

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

然后输入被解码,如这个游乐场示例所示。

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

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

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

如果您在未导出的字段中使用 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”,则代码有效。

这里不是这样; 但是如果您在从文件加载 json 时遇到此错误,如果缓冲区的字节切片未初始化文件的字节大小,则会发生此错误。 [当你像我一样是新人时,就会发生这种情况! ] 由于这是我得到的第一个搜索结果,它仍然需要一些挖掘才能弄清楚。 在这个用例中,错误有点误导。

type GenesisResultStruct []GenesisField

fileinfo, _ := genesis.Stat()
bs := make([]byte, fileinfo.Size())
//bs := []byte {} // wrong!!
_, error := genesis.Read(bs)

if error != nil {
    fmt.Println("genesis read error: ", error)
    os.Exit(1)
}

var jsonData GenesisResultStruct
eGen = json.Unmarshal(bs, &jsonData)

if eGen != nil {
    fmt.Println("genesis unmarshal error: ", eGen)
    os.Exit(1)
}

今天面临同样的问题。

如果respBytesnil或没有括号[]如果您将其解组为切片,您也可能会收到此错误。 在这种情况下,您需要显式设置respBytes

当您将其解组为切片时,字节切片中应使用括号[]

if src == nil {
    src = []byte("[]")
}

尝试使用来自DB的select查询时(使用sqlx),我遇到了同样的错误。

代码是这样的:

result := []*userRow{}
err := q.Select(&result, getUserByIDQuery, userID)
if err != nil {
    return false, e.Error(codes.Internal, e.DBError, err)
}

其中userRow定义为

type userRow struct {
    UserId        string
    FirstName     string
    LastName      string
}

为了解决我遇到的问题,我在结构中添加了一个db标记:

type userRow struct {
    UserId        string `db:"user_id"`
    FirstName     string `db:"first_name"`
    LastName      string `db:"last_name"`
}

希望这可以帮助一些人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM