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

时间:2015-01-16 23:17:34

标签: json go unmarshalling

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

提前致谢!

4 个答案:

答案 0 :(得分:5)

unexpected end of JSON input是JSON输入中a syntax error的结果(可能缺少"}]。该错误不依赖于您要解码的值的类型。

我使用示例JSON输入on the playground运行代码。它运行没有错误。

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

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

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

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

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

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

答案 1 :(得分:2)

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

private bool ValidateControls()
    {
        lblMessage.Text = "";
        if ((!string.IsNullOrEmpty(drpBranch.SelectedValue)) && (string.IsNullOrEmpty(txtPlot.Text)))
        {
            lblMessage.Text = "Please enter Plot number to get the Network details";
            lblMessage.ForeColor = Color.Red;
                return false;
        }
        if ((!string.IsNullOrEmpty(txtBlock.Text)) && (string.IsNullOrEmpty(txtPlot.Text)))
        {
            lblMessage.Text = "Please enter Plot number to get the Network details";
            lblMessage.ForeColor = Color.Red;
                return false;
        }
        //else
        if ((string.IsNullOrEmpty(txtEid.Text)) && (string.IsNullOrEmpty(txtAccountNo.Text)) && (string.IsNullOrEmpty(txtPlot.Text)) && ((string.IsNullOrEmpty(txtLongitude.Text)) &&
            (string.IsNullOrEmpty(txtYlatitude.Text))))
        {
            lblMessage.Text = "Please enter either EID or Account Number or Plot Number or X,Y co ordinates  to get the Network details";
            lblMessage.ForeColor = Color.Red;
            return false;
        }
        return true;
    }

如果您导出" MyJson.bar"字段(例如 - >" MyJson.Bar",然后代码可以工作。

答案 2 :(得分:1)

这里不是这样;但是如果您在从文件加载 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)
}

答案 3 :(得分:0)

在尝试使用数据库中的选择查询(使用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"`
}

希望这可以帮助那些陷入困境的人。