2023年4月7日金曜日

JSONIC で総称型を使ったデコード

 以下、マニュアルに記載のある内容であり、知っている人にとっては読む価値は無いメモ書き。

何度も忘れるので、ここに書いておく。

Java で JSON を扱う場合に未だ JSONIC を使っている。jackson への移行が推奨されているが、特にパフォーマンス面での不満を感じる規模の要件を対処することもなく機能的にも困っていないため、未だに利用している。

さて、以下のようなシンプルな配列の JSON がサーバに投げ込まれた場合において

[1, 2, 3]

Java で対応する場合、List<Integer> の形式でデコードしたい状況が存在する。

ただし、Java の文法的に以下のように総称型は指定できないため書けない。

String json = "[1,2,3]";
List<Integer> list = JSON.decode(json, List<Integer>.class); // 文法エラーとなる

このような状況に対して、TypeReference クラスを使ってオブジェクトで指定する形を取れば解決する。

List<Integer> list = JSON.decode(json, new TypeReference<List<Integer>>() {});

あるいは渡されるデータをフロントエンド側で投げ込むデータを JSON Object そのものにしてもらい。

{"list": [1, 2, 3]}

以下のように JSON リクエストデータに対応するクラスを準備し、クラス自体を使ってデコードすればよい。

@Data
public class ListRequestJson implements Serializable {
  private List<Integer> list;
}

...

ListRequestJson req = JSON.decode(json, ListRequestJson.class);

0 件のコメント:

コメントを投稿