トッカンソフトウェア

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に追加されていることを確認。


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



ページのトップへ戻る