我正在研究一些代码来解析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似乎有效。此错误是否与我的自定义结构有关?
提前致谢!
答案 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"`
}
希望这可以帮助那些陷入困境的人。