SpringBootを使って開発をしていたのですが、素のJavaとは違ってjsonを送ると勝手にクラスにマッピングしてくれるので、便利ですよね。しかし、単純なjsonなら良いのですが、複雑なjsonを送った場合はサーバー側で上手く処理をしてくれないときがありました。そこで今回は、Springのjsonマッピングに置いて、配列を持つjsonが上手く処理されずにエラーになってしまう問題を解決します。
これだけに1~2時間悩んでしまったので、もう2度と悩まないようにここに記しておきます。。
配列を持つjson変換時に起きていたエラーを解決する
それでは、json変換時のエラーを解決します。結論から言うと、以下の3点に気をつけるだけでエラーが解決しました。
- コントローラクラスの引数に@RequestBodyをつける
- ajaxでjsonを送信する時に、contentType="application/json"を指定する
- jsonが配列であるオブジェクトは、JavaクラスではListにする
詳しくはこの記事の下の方にあるコードをご覧ください。
起きていたエラー
当時は何をしても以下のエラーが繰り返されるだけで、全く進展がない状態でした。
- json[hoge][0]はMapでもListでもありません…のようなエラー
- List<init>が存在しない…のようなエラー
- NumberFormatExcetion
- NoSuchMethodException
- jsonの中身が全てnullになってしまう
json
{ "hoge": "abc", "fuga": [ {"piyo": "def"}, {"piyo": "ghi"} ] }
これが今回ハマった原因なのですが、jsonが配列を持っています。
Javaクラス
コントローラクラス。必要な部分以外は省略しています。
@RequestMapping(value = "/getJson", method = RequestMethod.POST) public void getJson( @RequestBody ReceiveForm form){ //注意。@RequestBodyつける。 //適当な処理 }
jsonマッピングクラス
public class ReceiveForm{ private String hoge; private List<String> piyo; // 注意。Listにする。 //setter, getter省略中 }
javascript
$.ajax({ url: '〜〜〜/getJson', type: 'POST', dataType: 'json', contentType: 'application/json', //注意。忘れないこと。 data: 先程のjson })
これで動きました。一番初めにも書きましたが、
- コントローラクラスの引数に@RequestBodyをつける
- ajaxでjsonを送信する時に、contentType="application/json"を指定する
- jsonが配列であるオブジェクトは、JavaクラスではListにする
を守ることが大切でした。
まとめ
Springのjsonマッピングで配列の箇所がエラーになるときの対処法です。もし同じような悩みを持っている方がいらっしゃいましたら、この記事がお役に立てたら幸いです。最後までお読みいただきありがとうございました。