JacksonはJavaでJSONとオブジェクトを変換する場合などに使用されるライブラリです。
Jacksonを使うと簡単にJSONを扱うことができます。
JSON文字列をオブジェクトに変換する
下記のJSON文字列をオブジェクトに変換したいとします。
JSON
String json = "{" +
"\"message\": null," +
"\"results\": [" +
" {\"address1\": \"北海道\"," +
" \"address2\": \"美唄市\"," +
" \"address3\": \"上美唄町協和\"," +
" \"kana1\": \"ホッカイドウ\"," +
" \"kana2\": \"ビバイシ\"," +
" \"kana3\": \"カミビバイチョウキョウワ\"," +
" \"prefcode\": \"1\"," +
" \"zipcode\": \"0790177\"}]," +
"\"status\": 200}";
変換したいオブジェクト
public class Response {
private String message;
private String status;
private Result[] results;
}
public class Result {
private String address1;
private String address2;
private String address3;
private String kana1;
private String kana2;
private String kana3;
private String prefcode;
private String zipcode;
}
以下のようにObjectMapperインスタンスを生成し、readValue()
を呼び出すだけでJSONからオブジェクトに変換できます。
ObjectMapper mapper = new ObjectMapper();
Response response = mapper.readValue(json, Response.class);
JSONの一部のプロパティを無視したい場合
ただし、上記はJSONのデータとオブジェクトのフィールドが一致していないときにはエラーが発生します。
例えば以下のようにフィールドに定義されていないプロパティ(hoge)が入っている場合はエラーとなります。
String json = "{" +
"\"message\": null," +
"\"results\": [" +
" {\"address1\": \"北海道\"," +
" \"address2\": \"美唄市\"," +
" \"address3\": \"上美唄町協和\"," +
" \"kana1\": \"ホッカイドウ\"," +
" \"kana2\": \"ビバイシ\"," +
" \"kana3\": \"カミビバイチョウキョウワ\"," +
" \"prefcode\": \"1\"," +
" \"zipcode\": \"0790177\"}]," +
"\"status\": 200," +
"\"hoge\": \"hoge\"}";
エラーを避けるためには@JsonIgnoreProperties(ignoreUnknown = true)
を指定する必要があります。
このアノテーションをつけることでJSONから変換される場合に、オブジェクトに定義されていないプロパティは無視されます。
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response {
private String message;
private String status;
private Result[] results;
}
JSONから一部の値を取得したい場合
JSONから値を取得するためにわざわざオブジェクトを作成したくないときもあるかもしれません。
そんなときはreadTree()
を使いJsonNodeを作成することでJSONのプロパティにアクセスすることができます。
配列はArrayNodeにキャストして配列として扱うことができます。
JsonNode status = mapper.readTree(json).get("status");
System.out.println(status.asText());
ArrayNode results = (ArrayNode) mapper.readTree(json).get("results");
for (JsonNode jsonNode: results) {
System.out.println(jsonNode.get("address1").asText());
}
実行結果
200
北海道