目次
JavaでJson⇄Javaオブジェクトを変換する
最近業務の改修作業でJavaを使う機会があったので、備忘録として残しておきます。
Json⇄Javaの変換はいくつかライブラリがあると思いますが、既存のプロジェクトでJacksonが疲れていたので、今回はJacksonでのパース方法をまとめておきます。
JSON→Javaオブジェクト
APIで取得した結果のJSONをJavaオブジェクトに変換する時などに使います。
シンプルなやつ
キレイに型をつけてパースできないのですが、1階層でフィールドも少なめだったら、JsonNodeとして扱えば楽です。
package jp.sample;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
String json = "{\"name\": \"hogehoge\", \"age\": 40}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
System.out.println(node.get("name").textValue());
}
}
hogehoge
JSON→リスト
JSONをJavaのリストに変換したい時です。
シンプルな場合
シンプルなやつは、new TypeReferenceでやると楽です。
package jp.sample;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import java.util.List;
import java.util.Map;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
String json = "{\"items\": [\"hoge\", \"hogehoge\"] }";
ObjectMapper mapper = new ObjectMapper();
Map<String, List<String>> nodeMap = mapper.readValue(json, new TypeReference<Map<String, List<String>>>(){});
List<String> nodeList = nodeMap.get("items");
for (String s : nodeList) {
System.out.println(s);
}
}
}
hoge
hogehoge
複雑な場合
フィールドも増えてきて、少し複雑になってきたら、Classにマップしてやると楽です。
package jp.sample;
import java.util.List;
public class Hoge {
public int id;
public String name;
public List<String> items;
}
package jp.sample;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
String json = "{\"id\": 333, \"name\": \"hogehoge\", \"items\": [\"hoge\", \"hogehoge\"] }";
ObjectMapper mapper = new ObjectMapper();
Hoge hoge = mapper.readValue(json, Hoge.class);
System.out.println(hoge.id);
System.out.println(hoge.name);
for (String s : hoge.items) {
System.out.println(s);
}
}
}
333
hogehoge
hoge
hogehoge
ネストされたり、複雑になってきたり
ネストされたり複雑になってきたりしたら、逆にJsonNodeでやると楽です。
クラスだと逆にマップするのも面倒になったりするので、型をキレイに付けようとせず、値だけ取り出して整形するぐらいなら、これが結局は自由度が高くて楽かもです。
package jp.sample;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
String json = "{" +
"\"id\": 333, " +
"\"hoge\": {" +
"\"name\": \"hogehoge1\"," +
"\"age\": 30" +
"}" +
" }";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readValue(json, JsonNode.class);
System.out.println(node.get("id"));
JsonNode hoge = node.get("hoge");
JsonNode nameNode = hoge.get("name");
String name = nameNode.asText();
System.out.println(name);
JsonNode ageNode = hoge.get("age");
String age = ageNode.asText();
System.out.println(age);
}
}
333
hogehoge1
30
Javaオブジェクト→JSON文字列
JavaオブジェクトをJSON文字列にして、クライアントに返したい時などには、こんな感じです。
package jp.sample;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
List<String> hogeList = new ArrayList<String>();
hogeList.add("hoge");
hogeList.add("hogehoge");
Hoge hoge = new Hoge();
hoge.id = 33333333;
hoge.name = "hogege";
hoge.items = hogeList;
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(hoge);
System.out.println(json);
}
}
{"id":33333333,"name":"hogege","items":["hoge","hogehoge"]}
参考サイト
まとめ
今回は、JavaのJacksonを使用して、Json⇄Javaオブジェクトを変換する方法について紹介しました!
Json⇄Javaオブジェクトを変換に使うライブラリはいくつかありますが、この変換は結構やる機会があると思うので、使いこなせるようにしておきたいですね!
コメント