Golang json 解组 "unexpected end of JSON input"
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
是 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)
解码器直接从响应体中读取。
如果您在未导出的字段中使用 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)
}
我正在编写一些代码来解析来自 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
是 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)
解码器直接从响应体中读取。
如果您在未导出的字段中使用 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)
}