0
0

More than 1 year has passed since last update.

Gsonでパースするときフィールド名が違うとちょっと困る

Posted at

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側に合わせることをお勧めします。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0