3行で解説
パースするとき、JSONのkeyとJavaオブジェクトのフィールド名を一致させると楽だよ。一致しない場合は明示的に「JSONでは○○というkeyのvalueは、Javaオブジェクトでは●●というフィールドに入れるよ」と書かないとダメ。
そもそもGsonとは?
Gsonは、JSONデータとJavaオブジェクトを相互変換するためのライブラリです。
本記事では、Gsonを使ってJSONデータをJavaオブジェクトにパースする処理(デシリアライズ)に絞ってお話します。
サンプル
例として、チャットアプリのトークルームをJSONで記述してみましょう。このオブジェクトはデータとして
- トークルームのID文字列
- トークルームの名前
- 最後に発信されたメッセージ
を持っていて、さらにメッセージオブジェクトは - 発言者のID
- メッセージの文字列
- 送信日時の文字列
を持っています。
{
"id": "トークルームのId",
"name": "hogehoge",
"lastMessage": {
"memberId": "発言者のid",
"message": "よろしくお願いします。",
"timestamp": "2023-08-02:10:15:22"
}
}
このデータをパースするためのJavaオブジェクトを定義します。
public class Talkroom {
private String id;
private String name;
private Message lastMessage;
}
public class Message {
private String memberId;
private String time; //変数名がJSONの"timestamp"ではないことに注目
private String message;
}
こちらも同じようなデータ構造になっていますが、JSONではtimestamp
となっていた部分の変数名だけtime
に変わっています。
パースするコード
String jsonString = "JSONの文字列"
Gson gson = new Gson();
Talkroom talkroom = gson.fromJson(jsonString, Talkroom.class);
コード自体は簡単で、fromJson()
メソッドにJSONの文字列とパース視てほしいクラスを渡すとその通りにパースしてくれます。
フィールド名が違う場合
先ほど、Messageクラスのtime
だけJSON側と異なる変数名にしました。これを放置してGsonにパースさせると、Gsonはtimeに格納する変数を見つけられず、変数はnullのままになります。変数名が違う場合は、Gsonに「JSONでtimestamp
と呼ばれているデータは、time
に入れてね!」と伝える必要があります。
@JsonProperty("timestamp")
private String time;
クラス定義の際に上のように書いてあげるとGsonに伝えることができます。(おそらく)この機能は、「JSONではkeyにハイフンが使われているけど、Javaでは変数名にハイフンを使えないよ!」みたいな時のために用意されている処理だと思います。特にこだわりがない場合は、Javaのフィールド名をJSON側に合わせることをお勧めします。
参考資料