本ブログにはプロモーションが含まれております。

Java

入れ子や配列を持つJsonとJavaオブジェクトの変換・マッピング

スポンサーリンク

こんにちは、まいまいです。

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-corejackson-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には対応できるようになるはずです。私もまだまだ勉強していきます!

最後までお読みいただきありがとうございました。

スポンサーリンク

-Java
-, ,

© 2024 教職志望だった文系エンジニア Powered by AFFINGER5