web-dev-qa-db-ja.com

Golang json Unmarshal「JSON入力の予期しない終了」

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はnilではありません。印刷すると、unexpected end of JSON input。これは何が原因ですか? JSONは有効なようです。このエラーはカスタム構造と関係がありますか?

前もって感謝します!

11
Stratus3D

unexpected end of JSON inputは、JSON入力の 構文エラー の結果です(おそらく"}、または])。エラーは、デコード先の値のタイプに依存しません。

サンプルのJSON入力でコードを実行しました 遊び場で 。エラーなしで実行されます。

resultフィールドはエクスポートされないため、コードは何もデコードしません。結果フィールドをエクスポートする場合:

type ResultStruct struct {
   Result []map[string]string
}

その後、入力は次のようにデコードされます プレイグラウンドの例

アプリケーションの応答本文全体を読んでいないと思われます。以下を使用してJSON入力をデコードすることをお勧めします。

err := json.NewDecoder(resp.Body).Decode(&jsonData)

デコーダーは、応答本文から直接読み取ります。

5
Cerise Limón

エクスポートされていないフィールドで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」)、コードは機能します。

2
Robert

(sqlxを使用して)DBから選択クエリを使用しようとしたときに、同じエラーが発生しました。

コードは次のようなものでした:

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"`
}

これが将来の誰かを助けることを願っています。

0