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は有効なようです。このエラーはカスタム構造と関係がありますか?
前もって感謝します!
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.bar」フィールドをエクスポートすると(例->「MyJson.Bar」)、コードは機能します。
(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"`
}
これが将来の誰かを助けることを願っています。