1. はじめに:Jacksonとは何か
JacksonはJavaで最も広く使われているJSONパーサー/シリアライザライブラリの一つです。JavaオブジェクトとJSONの相互変換を簡単かつ高速に実現でき、SpringやJerseyなど多くのフレームワークでも標準採用されています。APIがシンプルで拡張性も高く、様々な用途に柔軟に対応できるのが特徴です。Jacksonを使いこなせば、Web APIや設定ファイル、データ交換など、現代Java開発の多くの場面で役立ちます。
// 依存関係(Maven例)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
2. Jacksonのインストールとセットアップ
Jacksonを利用するには、jackson-databind(およびjackson-core, jackson-annotations)をプロジェクトに追加します。MavenやGradleで依存関係を記述するだけで簡単に導入できます。バージョンは2系が主流ですが、最新の安定版を選びましょう。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
3. ObjectMapperの基本とHello World
Jacksonの中心となるクラスがObjectMapperです。このクラス一つでJSON⇔Javaオブジェクトの変換が完結します。まずは最もシンプルな使い方を見てみましょう。
package sample.jackson;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
Hoge hoge = new Hoge();
hoge.id = 10;
hoge.name = "hoge";
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(hoge);
System.out.println(json);
}
}
class Hoge {
public int id;
public String name;
}
4. Javaオブジェクト→JSON文字列変換
JacksonはJavaオブジェクトをJSON文字列へ簡単に変換できます。writeValueAsString()やwriteValue()メソッドを使えば、ファイルやストリームへの出力も可能です。
ObjectMapper mapper = new ObjectMapper();
UserBean bean = new UserBean("Foo", 20);
String json = mapper.writeValueAsString(bean);
System.out.println(json); // {"name":"Foo","age":20}
5. JSON文字列→Javaオブジェクト変換
JSON文字列からJavaオブジェクトへのデシリアライズもreadValue()メソッドで簡単です。クラスのフィールドとJSONのキーが一致していれば自動でマッピングされます。
String json = "{\"name\": \"Bar\", \"age\": 30}";
ObjectMapper mapper = new ObjectMapper();
UserBean bean = mapper.readValue(json, UserBean.class);
System.out.println(bean);
6. ファイルやストリームでの入出力
Jacksonは文字列だけでなく、ファイルやInputStream/OutputStream、URLなど多様な入出力先をサポートしています。大量データや外部APIとの連携にも最適です。
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File("user.json"), bean); // ファイルに書き込み
UserBean loaded = mapper.readValue(new File("user.json"), UserBean.class); // ファイルから読み込み
7. 配列・コレクション・Mapの変換
Jacksonは配列やList、Set、Mapなどのコレクション型も簡単に変換できます。TypeReferenceを使えばジェネリック型にも対応可能です。
List<UserBean> users = Arrays.asList(new UserBean("A", 10), new UserBean("B", 20));
String json = mapper.writeValueAsString(users);
List<UserBean> result = mapper.readValue(json, new TypeReference<List<UserBean>>(){});
8. ネスト・複雑な構造のJSON変換
Jacksonはネストしたオブジェクトや複雑なJSON構造もシンプルに扱えます。Bean同士をフィールドとして持たせるだけで、入れ子構造のJSONも自動で変換されます。
class Address {
public String city;
public String street;
}
class User {
public String name;
public Address address;
}
String json = "{\"name\":\"Tom\",\"address\":{\"city\":\"Tokyo\",\"street\":\"Main\"}}";
User user = mapper.readValue(json, User.class);
9. JSONツリー操作(JsonNode)
JacksonのJsonNodeを使えば、JSONをツリー構造としてパースし、特定の要素だけを抽出・編集できます。全体をJavaオブジェクトに変換せず、部分的なデータ取得や動的な構造の処理に便利です。
import com.fasterxml.jackson.databind.JsonNode;
JsonNode root = mapper.readTree(json);
System.out.println(root.path("name").asText());
10. Mapや動的な型への変換
JSONをMapや任意の型に変換することも可能です。動的な構造やキーが決まっていないデータの扱いに役立ちます。
Map<String, Object> map = mapper.readValue(json, new TypeReference<Map<String, Object>>(){});
11. ストリーミングAPIによる大規模データ処理
JacksonのStreaming API(JsonParser/JsonGenerator)を使えば、巨大なJSONファイルもメモリ効率よく逐次処理できます。大量データの読み書きやリアルタイム処理に最適です。
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
StringWriter writer = new StringWriter();
JsonFactory factory = new JsonFactory();
try (JsonGenerator generator = factory.createGenerator(writer)) {
generator.writeStartObject();
generator.writeStringField("name", "mkyong");
generator.writeNumberField("age", 42);
generator.writeEndObject();
}
System.out.println(writer.toString()); // {"name":"mkyong","age":42}
12. アノテーションによるカスタマイズ
Jacksonは@JsonPropertyや@JsonIgnore、@JsonIncludeなど豊富なアノテーションでシリアライズ/デシリアライズの挙動を細かく制御できます。フィールド名の変更やnull除外、順序指定なども柔軟です。
import com.fasterxml.jackson.annotation.JsonProperty;
class User {
@JsonProperty("user_name")
public String name;
}
13. カスタムシリアライザ・デシリアライザ
標準の変換では対応できない場合、独自のシリアライザやデシリアライザを実装してObjectMapperに登録できます。特殊なフォーマットや変換ロジックを柔軟に追加可能です。
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.core.JsonGenerator;
public class CustomSerializer extends JsonSerializer<UserBean> {
@Override
public void serialize(UserBean value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("custom_name", value.getName());
gen.writeEndObject();
}
}
14. まとめと今後の展望
JacksonはJavaのJSON処理におけるデファクトスタンダードであり、APIのシンプルさ・拡張性・パフォーマンスの三拍子が揃っています。基本的な使い方から高度なカスタマイズ、巨大データや複雑な構造まで幅広く対応できるため、現代Java開発において必須のライブラリと言えるでしょう。今後もバージョンアップや新機能追加が期待されており、より便利に進化し続けるJacksonをぜひ活用してみてください。