Jackson JSON Proceccor で JSON を扱う (データバインディング編)
Java で JSON を扱うのに Jackson JSON Processor が便利です。他の JSON を扱うライブラリと比較するとパフォーマンスに優れるそうですが、何より API がシンプルで使いやすいです。
Jackson で JSON を扱うには 3 つの方法があります。今回紹介するのは、パフォーマンスは多少落ちますが最もシンプルなやり方「データバインディング」です。データバインディングでは JSON のスキーマと Java のクラスが 1:1 に対応します。
早速サンプルコードです。
package jp.example.jackson.databinding; import org.codehaus.jackson.map.ObjectMapper; public class Main { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); // JSON文字列 String json = "{\"name\": \"Foo\", \"age\": 20}"; // JSON文字列 を Bean に変換する UserBean bean = mapper.readValue(json, UserBean.class); // Bean の内容を標準出力に書き出す System.out.println(bean); // Bean を JSON文字列 に変換して標準出力に書き出す mapper.writeValue(System.out, bean); } }
ObjectMapper クラスのインスタンスを通して JSON を変換します。JSON から Bean に変換するには ObjectMapper#readValue() メソッド、反対に Bean から JSON に変換するには ObjectMapper#writeValue() メソッドを使います。
今回変換する JSON のスキーマには文字列のプロパティ "name" と数値のプロパティ "age" が含まれています。対応する Bean のクラスにも文字列 (String) と数値 (Integer) のフィールドを用意します。
package jp.example.jackson.databinding; public class UserBean { protected String name; protected Integer age; public UserBean() {} public UserBean(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "UserBean{" + "name=" + name + ", age=" + age + '}'; } }
何の変哲もない Bean ですね。
Main を実行すると以下のような出力が得られます。
UserBean{name=Foo, age=20} {"name":"Foo","age":20}
上が UserBean#toString() 下が ObjectMapper#writeValue() の結果です。
ご覧のように Jackson を使うと、とっても簡単に JSON を扱えます。今回は文字列と数値だけのシンプルな変換でしたが、配列を List や Set に変換したり、連想配列を Map に変換したり、オブジェクトがネストしているような複雑な JSON も同様に扱うことができます。