JacksonでJSON
今回はJacksonを使用して、JSON文字列⇔Javaオブジェクト変換をやります。クライアントとJSONのやり取りについては、Springに書いたので、そちらを参照して下さい。
ライブラリの取得
jackson-core、jackson-annotations、jackson-databindの3つのJarを用意します。JacksonのJar取得はMavenのサイトから取得します。
jackson-coreのサイトからダウンロードしたいバージョンのリンクをクリックし、
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/

その中でバージョン.jarファイルをダウンロードします。

jackson-annotations、jackson-databind も同じようにダウンロードします。
jackson-annotationsは http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/から。


jackson-databindは
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/から。


ライブラリの取得(Maven)
Mavenを使えば簡単に環境構築できます。groupId、artifactIdはプロジェクトに合わせて変更して下さい。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mvnTest</groupId>
<artifactId>mvnTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
</project>
JSON文字列⇔Javaオブジェクト変換(Map、List)
まずJson文字列からMapオブジェクトに変換してみます。Listオブジェクトも生成する場合も同じようにやります。Javaソースは以下のようになります。
package test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTest {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
// マップにデータ・セット
Map<String, String> mapFrom = new HashMap<>();
mapFrom.put("key1", "abc");
mapFrom.put("key2", "def");
mapFrom.put("key3", "123");
// 整形
mapper.enable(SerializationFeature.INDENT_OUTPUT);
// マップからJson文字列に変更
String jsonFrom = mapper.writeValueAsString(mapFrom);
System.out.println("MapからJson文字列に変更:" + jsonFrom);
// Json文字列からマップに変更
Map<String, String> mapTo = mapper.readValue(jsonFrom, new TypeReference<Map<String, String>>() {
});
System.out.println("Json文字列からMapに変更:" + mapTo);
} catch (IOException e) {
e.printStackTrace();
}
}
}
JavaオブジェクトからJson文字列取得
JavaオブジェクトからJson文字列取得はObjectMapperクラスのwriteValueAsStringメソッドを使用します。
// マップからJson文字列に変更
String jsonFrom = mapper.writeValueAsString(mapFrom);
Json文字列からJavaオブジェクト生成(Map、List)
Json文字列からJavaオブジェクト生成はObjectMapperクラスのreadValueメソッドを使用します。
// Json文字列からマップに変更
Map<String, String> mapTo = mapper.readValue(jsonFrom, new TypeReference<Map<String, String>>() {});
MapやListを生成する場合は、TypeReferenceクラスを使用します。
JSON文字列⇔Javaオブジェクト変換(独自クラス)
次にJSON文字列から独自クラスを生成します。TypeReferenceを使用しないだけで、上記とほとんど同じです。まずは外部クラスのサンプルで、下に内部クラスのサンプルを書きます。
package test;
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTest {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
Data data = mapper.readValue("{\"key\":\"xxx\", \"value\":\"yyy\"}", Data.class);
data.setKey(data.getKey() + "abc");
data.setValue("def");
String jsonStr = mapper.writeValueAsString(data);
System.out.println(jsonStr);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package test;
public class Data {
String key;
String value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Json文字列からJavaオブジェクト生成(独自クラス)
ObjectMapperクラスのreadValueメソッドを使用しますが、TypeReferenceは使用しません。
Data data = mapper.readValue("{\"key\":\"xxx\", \"value\":\"yyy\"}", Data.class);
JSON文字列⇔Javaオブジェクト変換(独自クラスで内部クラス)
独自クラスを内部クラスで作成したサンプルです。内部クラスはstaticクラスにする必要があります。
package test;
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTest {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
Data data = mapper.readValue("{\"key\":\"xxx\", \"value\":\"yyy\"}", Data.class);
data.setKey(data.getKey() + "abc");
data.setValue("def");
String jsonStr = mapper.writeValueAsString(data);
System.out.println(jsonStr);
} catch (IOException e) {
e.printStackTrace();
}
}
private static class Data {
String key;
String value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}
内部クラスをstaticクラスにしなかった場合、実行時に以下のエラーになります。
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type
[simple type, class test.JsonTest$Data]: can not instantiate from JSON object
(missing default constructor or creator, or perhaps need to add/enable type information?)
JSON文字列(ファイル)⇔Javaオブジェクト
最後にJavaオブジェクトをJSON文字列形式でファイルに保存、読み込みをやります。
package test;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTest {
public static void main(String[] args) {
String path = "c:\\work\\test.txt";
ObjectMapper mapper = new ObjectMapper();
try {
// マップにデータ・セット
Map<String, String> mapFrom = new HashMap<>();
mapFrom.put("key1", "abc");
mapFrom.put("key2", "def");
mapFrom.put("key3", "123");
// マップをJson文字列でファイルに保存
mapper.writeValue(new File(path), mapFrom);
// ファイルからJson文字列を読み込み、マップに変更
Map<String, String> mapTo = mapper.readValue(new File(path), new TypeReference<Map<String, String>>() {
});
System.out.println("Map:" + mapTo);
} catch (IOException e) {
e.printStackTrace();
}
}
}
JSON文字列でファイルに保存するには、ObjectMapperクラスのwriteValueメソッドで行います。
// マップをJson文字列でファイルに保存
mapper.writeValue(new File(path), mapFrom);
JSON文字列が出力されたファイルを読み込むにはO、bjectMapperクラスのreadValueメソッドの引数を変えます。
// ファイルからJson文字列を読み込み、マップに変更
Map<String, String> mapTo = mapper.readValue(new File(path), new TypeReference<Map<String, String>>() {});
整形
JSONを整形する場合は、以下を実行します。
// 整形
mapper.enable(SerializationFeature.INDENT_OUTPUT);
コンパイルエラー発生時
コンパイルエラーが発生した場合、ダウンロードしたJarが参照されているか確認して下さい。参照されていない場合、以下のようにビルドパスに追加して下さい。プロジェクトを右クリックして Configure Build Path...を選択。

Librariesタブを選択して、Add External Jars...ボタンを押す。

ダウンロードしたJarファイルを選択する(複数選択OK)。

Librariesに追加されていることを確認。

これでコンパイルエラーはなくなるはずです。

ページのトップへ戻る