0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Java Jacksonで学ぶJSONシリアライズ&デシリアライズ入門

0
Posted at

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をぜひ活用してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?