Java Jackson ライブラリ
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>
<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 メソッドは省略
}
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}
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
}
*/
.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(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}]
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}
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();
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
ベストプラクティス
- ObjectMapper の再利用:インスタンスの生成は
ObjectMapperコストが大きいため、同じインスタンスを再利用すべきです - 例外の処理:必ず処理する
JsonProcessingExceptionとIOException - DTO パターンの使用:ドメインモデルを直接シリアライズせず、専用のデータ転送オブジェクト(DTO)を使用します
- パフォーマンスの考慮:高性能なシナリオでは、
JsonFactory低レベルの操作を実行できます
まとめ
Jackson は Java で JSON を処理するための強力なツールであり、以下を提供しています:
- シンプルで使いやすい API
- 高性能な JSON 処理能力
- 豊富なカスタマイズオプション
- 優れたコミュニティサポート
Jackson をマスターすると、Java 開発における JSON データ処理の効率と柔軟性を大幅に向上させることができます。
その他の拡張
Java でよく使うクラスライブラリ