Java Jackson ライブラリ

Java 常用类库Java でよく使うクラスライブラリ


Jackson は Java 用の高性能 JSON 処理ライブラリであり、次のことができます:

  • Java オブジェクトを JSON 形式にシリアライズする(オブジェクト → JSON)
  • JSON を Java オブジェクトにデシリアライズする(JSON → オブジェクト)

Jackson は高速で、機能が強力で、使いやすいことから、Java エコシステムで最も人気のある JSON 処理ライブラリの1つとなっています。

Jackson コアモジュール

  • 1. Jackson Core:Jackson のコアモジュールで、基本的な JSON 解析・生成機能を提供します。
  • 2. Jackson Annotations:さまざまなアノテーションを含み、シリアライズおよびデシリアライズのプロセスを制御するために使用します。
  • 3. Jackson Databind:データバインディング機能を提供し、Java オブジェクトと JSON の間で変換を行うことができます。

基本的な使用方法

依存関係の追加

まず、プロジェクトに Jackson の依存関係を追加する必要があります(Maven を例にします):
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

Java オブジェクトと JSON を相互変換する簡単な例:

例

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonDemo {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
       
        // Java オブジェクトを JSON に変換
        Person person = new Person("张三", 30);
        String json = mapper.writeValueAsString(person);
        System.out.println(json);
       
        // JSON を Java オブジェクトに変換
        Person parsedPerson = mapper.readValue(json, Person.class);
        System.out.println(parsedPerson);
    }
}

class Person {
    private String name;
    private int age;
   
    // 引数なしコンストラクタが必要です
    public Person() {}
   
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
   
    // getter と setter が必要です
    // getter/setter と toString メソッドは省略
}

ObjectMapper の作成

ObjectMapperJackson のコアクラスで、シリアライズとデシリアライズを担当します:

ObjectMapper mapper = new ObjectMapper();

JSON シリアライズ(オブジェクト → JSON)

簡単な例

例

public class Person {
    private String name;
    private int age;
    // コンストラクタ、getter、setter は省略
}

Person person = new Person("张三", 25);
String json = mapper.writeValueAsString(person);
System.out.println(json);
// 出力: {"name":"张三","age":25}

整形出力

例

String prettyJson = mapper.writerWithDefaultPrettyPrinter()
                         .writeValueAsString(person);
System.out.println(prettyJson);
/*
出力:
{
"name" : "张三",
  "age" : 25
}
*/


JSON デシリアライズ(JSON → オブジェクト)

簡単な例

例

String json = "{\"name\":\"李四\",\"age\":30}";
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName()); // 出力: 李四

ファイルから読み取り

Person person = mapper.readValue(new File("person.json"), Person.class);

一般的なアノテーション

Jackson はシリアライズとデシリアライズのプロセスを制御するためのさまざまなアノテーションを提供しています:

@JsonProperty

JSON プロパティ名を指定します:

@JsonProperty("user_name")
private String name;

@JsonIgnore

特定のフィールドを無視します:

@JsonIgnore
private String password;

@JsonFormat

日付をフォーマットします:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date birthDate;

複雑な型の処理

コレクション型

例

List people = Arrays.asList(
    new Person("王五", 28),
    new Person("赵六", 32)
);

String json = mapper.writeValueAsString(people);
// 出力: [{"name":"王五","age":28},{"name":"赵六","age":32}]

Map 型

例

Map<String, Object> data = new HashMap<>();
data.put("name", "张三");
data.put("age", 25);
data.put("isStudent", true);

String json = mapper.writeValueAsString(data);
// 出力: {"name":"张三","age":25,"isStudent":true}

高度な機能

カスタムシリアライズ/デシリアライズ

継承によってJsonSerializerとJsonDeserializerカスタムのシリアライズおよびデシリアライズロジックを実装できます。

多態型の処理

使用@JsonTypeInfoと@JsonSubTypesアノテーションで継承と多態性を処理します。

ツリーモデル

Jackson はツリーモデル API を提供しており、JSON ノードを直接操作できます:

例

JsonNode rootNode = mapper.readTree(json);
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();

ベストプラクティス

  1. ObjectMapper の再利用:インスタンスの生成はObjectMapperコストが大きいため、同じインスタンスを再利用すべきです
  2. 例外の処理:必ず処理するJsonProcessingExceptionとIOException
  3. DTO パターンの使用:ドメインモデルを直接シリアライズせず、専用のデータ転送オブジェクト(DTO)を使用します
  4. パフォーマンスの考慮:高性能なシナリオでは、JsonFactory低レベルの操作を実行できます

まとめ

Jackson は Java で JSON を処理するための強力なツールであり、以下を提供しています:

  • シンプルで使いやすい API
  • 高性能な JSON 処理能力
  • 豊富なカスタマイズオプション
  • 優れたコミュニティサポート

Jackson をマスターすると、Java 開発における JSON データ処理の効率と柔軟性を大幅に向上させることができます。

Java 常用类库Java でよく使うクラスライブラリ

その他の拡張