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", то код работает.