Golang json Unmarshal " неожиданный конец ввода JSON"
Я работаю над некоторым кодом для анализа данных JSON из HTTP-ответа. Код, который у меня есть, выглядит примерно так:
type ResultStruct struct {
result []map[string]string
}
var jsonData ResultStruct
err = json.Unmarshal(respBytes, &jsonData)
json в respBytes
переменной выглядит так:
{
"result": [
{
"id": "ID 1"
},
{
"id": "ID 2"
}
]
}
однако, err
- это не ноль. Когда я распечатываю его, он говорит unexpected end of JSON input
. В чем причина? В JSON, кажется, действует. Эта ошибка имеет какое-то отношение к моей пользовательской структуре?
спасибо заранее!
2 ответов
на unexpected end of JSON input
результат синтаксическая ошибка на входе JSON (вероятно, отсутствует "
, }
или ]
). Ошибка не зависит от типа значения, на которое выполняется декодирование.
я запустил код с примером ввода 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.поле " бар "(например - > " MyJson.Bar", то код работает.