こんにちは、まいまいです。
Jacksonを使うと、JsonとJavaのクラスを簡単に対応させられることを最近知り、とても便利だと驚いています。
しかし、Jsonの1項目とJavaの1変数のマッピングなら簡単でも、オブジェクトや配列構造を持つJsonと、Javaのクラスってどう書いたら良いのか分かりませんでした。
しばらく悩んだ後に解決したので、その変換を書き記します。
Json配列にはリスト。JsonオブジェクトにはJavaオブジェクト
結論から言うと、
- Jsonの配列 ⇔ Javaのリスト
- Jsonのオブジェクト ⇔ Javaのオブジェクト(クラス)
でマッピングすることができます。
よく考えたら、Jsonの「オブジェクト」なんですからJavaの「オブジェクト」で対応させて当たり前でした。。
変換したいJson
以下のJsonをJavaとマッピングさせたいと思います。
- 階層: name, information, favoritefoodの3つ。
- informationはさらにage, address, hobbyを持つ。
- favoritefoodはさらにJapanese, Italianのオブジェクトの配列を持つ。
こういう結構ややこしいjsonでも大丈夫です!
{ "name" : "taro", "information" : { "age": 19, "address": "Tokyo", "hobby": "game" }, "favoriteFood" : [ { "Japanese": "sushi", "Italian": "pizza" }, { "Japanese": "tempura", "Italian": "pasta" } ] }
なお、Jacksonをインポートしておいてください。
こちらのMavenリポジトリからJackson Databindをダウンロードできます。
bundle_をクリックするとダウンロードが始まりますので、ダウンロード後はビルドパスを通してください。
Mavenの方はpomに追加してmaven cleanとmaven installを実行。
※もしかしたらjackson-coreとjackson-annotationも必要かもしれません。
上記のjackson-databindだけではエラーが出る場合はダウンロードをお願いします。
確認不足ですみません。。
対応するJavaクラス
先程のjsonの項目に合わせてUserクラスを作成します。
Userクラスはname, information, favoriteFoodの3つの情報を持っており、informationとfavoriteFoodはそれぞれjsonに合わせた項目を持っています。
※もちろんクラスは分けて書くか、インナークラスにしてください。便宜上ここではまとめて記載しています。
public class User { private String name; private Information info; private List<FavoriteFood> favoriteFood; //getter, setterは必ず書く。書かないとエラーになる。 } public class Information { private int age; private String address; private String hobby; //getter, setter } public class FavoriteFood { private String Japanese; private String Italian; //getter, setter }
Json→Javaクラスの変換
public class Main{ public static void main(String[] args) { String json = "冒頭のjson文字列"; ObjectMapper mapper = new ObjectMapper(); User user = mapper.readValue(json, User.class); //これだけでuserの変数にしっかり全て入っています! } }
Javaクラス→Jsonの変換
public class Main { public static void main(String[] args) { Information info = new Information(); List<FavoriteFood> fFoodList = new ArrayList<>(); //infoとfFoodListに情報を詰める処理(ここでは省略) User user = new User(); user.setName("Taro"); user.setInformation(info); user.setFavoriteFood(fFoodList); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(user); //この2行で、冒頭に書いた階層を持つjsonが作成できます } }
まとめ
入れ子や配列・オブジェクトを持つJsonをJavaのクラスに変換する方法をご紹介しました。
配列にはJavaのリストを、オブジェクトにはJavaのオブジェクトを対応させることができます。
ここまでできると、ある程度のJsonには対応できるようになるはずです。私もまだまだ勉強していきます!
最後までお読みいただきありがとうございました。