Go言語で、JSONをパースする際に躓きましたので原因をまとめておきます。
json.UnmarshalでJSONパースする際のハマったポイントです。
スポンサーリンク
マッピングのミス
単純なミスなのですが、変数の後ろのタグの記述にミスがあると、変数に値が代入されません。
僕は下記のようなミスをしました。
type Data struct { DataList []string `json:data` }
タグのKEY名をダブルクォーテーションで囲っていません。
これだと正しくマッピングされないので、空で返ってきてしまいます。
正しくはこうなります。
type Data struct { DataList []string `json:"data"` }
混乱したのが、タグに指定した値が上記ように不正だと変数名でマッピングされるんです。
なので、タグが間違っているのにマッピングが成功しているように見えたりして余計に混乱してしまいました。
型の不一致
JSONのNumbers型をstringで受けてしまうと、正しくパースされません。
JSONのNumbers型とString型は下記のような違いです。
Numbers型のJSON
{ "number": 111 }
String型のJSON
{ "number": "111" }
Numbers型は、値がダブルクォーテーションで囲われていない数値のものです。
Numbers型は、Go側ではstring型ではなく、json.Number型で受け取ると正しく動きます。
Goの構造体
type Data struct { Number json.Number `json:"number"` }
これでOKです!
僕は、上記の2点の修正で無事にJSONをパースできました!
まとめ
json.UnmarshalでJSONをパースが失敗した時は下記を確認してみましょう!
- KEY名をダブルクォーテーションで囲っているか?
- 受け取るデータの型は合っているか?
Go言語ってけっこう異色ですね。
PHP、Java、C++などの言語を扱って来ましたがGoはかなり躓きます。
まあ、だからこそGoを使えるようになったらプログラマーとしてステップアップ出来るかな?なんて思っています。
最後までお読み頂きありがとうございました!