![](/img/trans.png)
[英]Why do these golang JSON Unmarshal examples behave differently?
[英]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 input
的unexpected 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)
}
今天面临同样的问题。
如果respBytes
为nil
或没有括号[]
如果您将其解组为切片,您也可能会收到此错误。 在这种情况下,您需要显式设置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.