🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

2回答

9380閲覧

Go言語でのjson.Unmarshalでunexpected end of JSON inputが出る

kagepedia

総合スコア16

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2021/01/01 16:35

編集2021/01/01 16:43

GoでAPIを作っています。
フロントから送信されたデータを取り出して処理を行っているのですが、json.Unmarshal部分でエラーが出力されます。

データは以下のような物が入っています。

data

1{"data1":"xxxxxxxx@gmail.com","data2":"yyyyyyyy"}

Go

1 body, err := ioutil.ReadAll(r.Body) 2 if err != nil { 3 log.Logging(err, 1) 4 return 5 } 6 7 jsonBytes := ([]byte)(body) 8 data := new(InputSidJsonSchema) 9 if err := json.Unmarshal(jsonBytes, data); err != nil { 10 log.Logging(err, 2) 11 return 12 } 13

エラーは
log.Logging(err, 2)
の箇所で確認されています。

*** 追記 ***

Go

1type InputSidJsonSchema struct { 2 Data1 string `json:data1` 3 Data2 string `json:data2` 4}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A_kirisaki

2021/01/01 16:38

InputSidJsonSchema の型定義を見せていただけると助かります。
kagepedia

2021/01/01 16:44

追記しました。
guest

回答2

0

問題を切り分け してみましょう。unexpected end of JSON input というエラーメッセージはJSONの構文が間違っているときに起こります。

まずは string(body) などとしてフロントエンドからリクエストされるJSON文字列が意図したものか確かめてみましょう。


例えば以下のような単純なAPIは機能します。

go

1package main 2 3import ( 4 "encoding/json" 5 "io/ioutil" 6 "log" 7 "net/http" 8) 9 10type InputSidJsonSchema struct { 11 Data1 string `json:"data1"` 12 Data2 string `json:"data2"` 13} 14 15func sampleHandler(w http.ResponseWriter, r *http.Request) { 16 body, err := ioutil.ReadAll(r.Body) 17 if err != nil { 18 log.Printf("read all: %v", err) 19 return 20 } 21 22 jsonBytes := body 23 24 // 意図した文字列がフロントエンドからリクエストされているか確認 25 log.Printf("request body=%s\n", string(body)) 26 27 data := new(InputSidJsonSchema) 28 if err := json.Unmarshal(jsonBytes, data); err != nil { 29 log.Printf("unmarshal json: %v", err) 30 return 31 } 32 33 log.Printf("data=%+v", data) 34} 35 36func main() { 37 http.HandleFunc("/sample", sampleHandler) 38 if err := http.ListenAndServe(":8080", nil); err != nil { 39 log.Fatal(err) 40 } 41}
  • curlでリクエスト
$ curl -i -H "Content-Type: application/json" -d '{"data1": "xxxxxxxx@gmail.com", "data2": "yyyyyyyy"}' http://localhost:8080/sample HTTP/1.1 200 OK Date: Sat, 02 Jan 2021 08:10:19 GMT Content-Length: 0
  • Goのサーバが出力するログ
2021/01/02 17:10:19 request body={"data1": "xxxxxx.xx@gmail.com", "data2": "yyyyyyyy"} 2021/01/02 17:10:19 data=&{Data1:xxxxxx.xx@gmail.com Data2:yyyyyyyy}

投稿2021/01/02 08:11

d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あ、多分これですね。JSON 化する前に r.Body を読み込んでませんか?
手軽にGoのResponse.Bodyを再利用したいとき - Crieit

Response.Body はストリームなので気軽にアクセスすると最後まで読み込んでしまい後は捨ててしまうので何らかの方法でコピーを取るなりする必要があります。

投稿2021/01/01 17:17

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問