Java Jacksonの基本的な使い方


Javaの「Jackson」はデファクト・スタンダードなJSONをパースするライブラリです。JavaのオブジェクトをJSONに変換したり、JSONの文字列を受け取ってJavaのオブジェクトに変換できます。

👽 インストール

Gradleを使っている場合はbuild.gradleにdependenciesを追加します。gradle clean compileJava --debugを実行してコンパイルがとおれば成功です。

apply plugin: 'java'
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
repositories {
mavenCentral()
}
// 以下を追加
dependencies {
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.8.1'
}

pom.xmlを使っている場合はこちらを追加します。

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.8</version>
</dependency>

🎉 Javaオブジェクト => JSON

JavaのオブジェクトからJSON形式でデータを出力します。

public class Sample {
public int id;
public String name;
// thread safeなのでstatic fieldに持って使いまわすことが推奨されています
private static ObjectMapper objectMapper = new ObjectMapper();
Sample() {
// インデントを見やすく整形
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
}
// getXXXもJSONの出力対象になります
public String getIdName() {
return String.valueOf(id) + name;
}
public static void main(String[] args) throws JsonProcessingException {
Sample hoge = new Sample();
hoge.id = 1;
hoge.name = "hoge";
// ObjectMapperでSampleオブジェクト => json に変換します
String json = objectMapper.writeValueAsString(hoge);
System.out.println(json);
}
}

出力は次のようになります。

{
"id" : 1,
"name" : "hoge",
"idName" : "1hoge"
}

ちなみにJacksonのObjectMapperはスレッドセーフですので、static fieldにしてインスタンスを使いまわすことが推奨されています。

java - Should I declare Jackson’s ObjectMapper as a static field?

🚜 基本的な使い方

JSON文字列 => Javaオブジェクト

JSON形式のデータ(文字列)からJavaのオブジェクトを生成します。

public class Sample {
public int id;
public String name;
private static ObjectMapper objectMapper = new ObjectMapper();
@Override
public String toString() { return "id = " + id + ", name = " + name; }
public static void main(String[] args) throws IOException {
String jsonStr = "{\"id\":1,\"name\":\"hoge\"}";
// ObjectMapperでjson => Sampleへの変換を行う
Sample result = objectMapper.readValue(jsonStr, Sample.class);
System.out.println(result);
}
}

出力は次のようになります。

id = 1, name = hoge

List/Mapを含むJSON => Javaオブジェクト

ListやMapなどの型引数をもつクラスをJavaオブジェクトに変換する場合はTypeReferenceを利用します。TypeReferenceによって型安全にでぃシリアライズできます。

public class Sample {
public int id;
public String name;
private static ObjectMapper objectMapper = new ObjectMapper();
@Override
public String toString() {
return "id = " + id + ", name = " + name;
}
public static void main(String[] args) throws IOException {
String jsonStr = "[{\"id\":1, \"name\":\"hoge\"}, {\"id\":2, \"name\":\"fuga\"}]";
// ObjectMapperでjson => Sampleへの変換を行う
List<Sample> result = objectMapper.readValue(jsonStr, new TypeReference<List<Sample>>() {
});
System.out.println(result);
}
}

出力は次のとおりです。

[id = 1, name = hoge, id = 2, name = fuga]

🐯 アノテーション

アノテーションを使うことで簡単に出力するJSONを加工できます。

JSONのプロパティ名を変更:@JsonProperty

@JsonPropertyは出力するプロパティの名前を変更するアノテーションです。

public class Sample {
public int id;
@JsonIgnore
public String name;
private static ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) throws IOException {
Sample hoge = new Sample();
hoge.id = 1;
hoge.name = "hoge";
// ObjectMapperでSampleオブジェクト => json に変換します
String json = objectMapper.writeValueAsString(hoge);
System.out.println(json);
}
}

出力したJSONではフィールド名がfieldNameに変更されました。

{"id":1,"fieldName":"hoge"}

特定のフィールドを対象外にする:@JsonIgnore

@JsonIgnoreは特定のフィールドをJSONの変換対象外にするアノテーションです。

public class Sample {
public int id;
@JsonIgnore
public String name;
private static ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) throws IOException {
Sample hoge = new Sample();
hoge.id = 1;
hoge.name = "hoge";
// ObjectMapperでSampleオブジェクト => json に変換します
String json = objectMapper.writeValueAsString(hoge);
System.out.println(json);
}
}

出力したJSONではnameフィールドが出力されませんでした。

{"id":1}

対象外のフィールドをまとめて設定:@JsonIgnoreProperties

@JsonIgnorePropertiesをクラスに設定することで、複数のフィールドをまとめてJSON出力の対象外にできます。

@JsonIgnoreProperties({ "id", "description" })
public class Sample {
public int id;
public String name;
public String description;
private static ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) throws IOException {
Sample hoge = new Sample();
hoge.id = 1;
hoge.name = "hoge";
hoge.description = "hoge description";
// ObjectMapperでSampleオブジェクト => json に変換します
String json = objectMapper.writeValueAsString(hoge);
System.out.println(json);
}
}

出力したJSONではiddescriptionフィールドが出力されませんでした。

{"name":"hoge"}

JSONの未定義フィールドを無視する

デフォルトの挙動では、パースするJSONに未定義のフィールドがある場合、エラーとなります。それを回避するには@JsonIgnorePropertiesアノテーションにignoreUnkown = trueを設定します。

// ignoreUnknownがない場合はfugaが未定義のためエラーとなる
@JsonIgnoreProperties(ignoreUnknown = true)
public class Sample {
public int id;
public String name;
private static ObjectMapper objectMapper = new ObjectMapper();
@Override
public String toString() { return "id = " + id + ", name = " + name; }
public static void main(String[] args) throws IOException {
String jsonStr = "{\"id\":1,\"name\":\"hoge\", \"fuga\":\"fugafuga\"}";
// ObjectMapperでjson => Sampleへの変換を行う
Sample result = objectMapper.readValue(jsonStr, Sample.class);
System.out.println(result);
}
}

コンストラクタの指定:@JsonCreator

@JsonCreatorでJSON文字列からJavaオブジェクトへの変換を行うコンストラクタを指定できます。

public class Sample {
public int id;
public String name;
private static ObjectMapper objectMapper = new ObjectMapper();
@Override
public String toString() { return "id = " + id + ", name = " + name; }
// Json => Sampleオブジェクトに変換するコンストラクタを指定
@JsonCreator
private Sample(@JsonProperty("id") int id, @JsonProperty("name") String name) {
this.id = id;
this.name = name + String.valueOf(id);
}
public static void main(String[] args) throws IOException {
String jsonStr = "{\"id\":1,\"name\":\"hoge\"}";
// ObjectMapperでjson => Sampleへの変換を行う
Sample result = objectMapper.readValue(jsonStr, Sample.class);
System.out.println(result);
}
}

出力は次のようになり、指定したコンストラクタが使われていることがわかります。

id = 1, name = hoge1

コンストラクタの指定:@JsonValue

@JsonValueでJavaオブジェクトからJSONに変換するメソッドを指定できます。

public class Sample {
public int id;
public String name;
public String description;
private static ObjectMapper objectMapper = new ObjectMapper();
@JsonValue
public Map<String, String> toJson() {
Map map = new LinkedHashMap<String, String>();
map.put("id", String.valueOf(id));
map.put("description", description);
return map;
}
public static void main(String[] args) throws IOException {
Sample hoge = new Sample();
hoge.id = 1;
hoge.name = "hoge";
hoge.description = "hoge description";
// ObjectMapperでSampleオブジェクト => json に変換します
String json = objectMapper.writeValueAsString(hoge);
System.out.println(json);
}
}

出力は次のようになります。

{"id":"1","description":"hoge description"}

🏀 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)