Jackson JSON Proceccor で JSON を扱う (データバインディング編)

JavaJSON を扱うのに 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 も同様に扱うことができます。