Java JacksonでJSONとJavaオブジェクトを変換する

JavaのJacksonでJSONとJavaオブジェクトを変換するサンプルです。

確認環境
・JDK 8
・Eclipse 4.8

目次

Jackson

Jacksonのライブラリを取得する

JacksonライブラリをMavenまたはjarファイルのダウンロードで取得する方法です。

Maven

pom.xmlに2~7行目を追加します。1,8行目がない場合は1,8行目も追加します。

<dependencies>
	<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
	<dependency>
	    <groupId>com.fasterxml.jackson.core</groupId>
	    <artifactId>jackson-databind</artifactId>
	    <version>2.9.7</version>
	</dependency>
</dependencies>

https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.9.7

上記コードの追加で、jackson-databindの他にjackson-annotationsとjackson-coreも追加されます。

jarファイル

jarファイルもMavenRepositoryのサイトにあります。
https://mvnrepository.com/artifact/com.fasterxml.jackson.core

上記リンクから、「Jackson Databind」をクリックしVersionの「2.x.x」をクリックして、以下の図の「Files」の横にある「bundle」をクリックするとjarファイルがダウンロードされます。

jackson-databind-2.x.x.jarの他に
jackson-annotations-2.x.x.jarとjackson-core-2.x.x.jarもダウンロードします。

ダウンロード完了後、jarファイルをクラスパスに追加します。
Eclipse 外部jarファイルをクラスパス(ビルドパス)に設定する方法

 

JSONからJavaオブジェクトに変換する

JSONからJavaオブジェクトに変換するサンプルです。

jsonデータのその1です。

{
    "id": 1,
    "name": "taro",
    "sikaku": [
        "基本",
        "応用"
    ]
}

jsonデータのその2です。

{
    "id": 2,
    "name": "jiro"
}

上記JSONをJavaオブジェクトに変換するコードです。

package test1;
import java.io.IOException;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

class Syain {
	private int id;

	//@JsonPropertyは、JSONのnameと紐付けする
	@JsonProperty("name")
	private String n;

	private List<String> sikaku; // 資格
	
	public int getId() {
		return id;
	}
	public String getN() {
		return n;
	}
	public List<String> getSikaku() {
		return sikaku;
	}
}
public class Test1 {
	public static void main(String[] args) {
		
	//JSONのデータ1
	String testJson1 =
	"{\"id\":1, \"name\":\"taro\",\"sikaku\":[\"基本\",\"応用\"]}";
	//JSONのデータ2
	String testJson2 = "{\"id\":2, \"name\":\"jiro\"}";
	
	//Javaオブジェクトの生成
	Syain syain1 = new Syain();
	Syain syain2 = new Syain();
	
	ObjectMapper mapper = new ObjectMapper();

	try {
		//JSONからJavaオブジェクトに変換
		syain1 = mapper.readValue(testJson1, Syain.class);
		syain2 = mapper.readValue(testJson2, Syain.class);

		//Javaオブジェクトのデータの確認
		System.out.println(syain1.getId()); // 1
		System.out.println(syain1.getN()); // taro
		System.out.println(syain1.getSikaku()); // [基本, 応用]
		
		System.out.println(syain2.getId()); // 2
		System.out.println(syain2.getN()); // jiro
		System.out.println(syain2.getSikaku()); // null
	
	} catch (JsonParseException e) {
		e.printStackTrace();
	} catch (JsonMappingException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	}
}

13行目の@JsonPropertyは、JSONの名前と紐付けします。@JsonPropertyがない場合、JSONと紐付けできないのでエラーになります。
16行目は、リストです。
33,35行目のJSONはリテラルなのでダブルコーテーションの前にエスケープシーケンスの\が入っています。
45,46行目は、JSONからJavaオブジェクトに変換しています。

 

JavaオブジェクトからJSONに変換する

JavaオブジェクトからJSONに変換するサンプルです。

作成するJSONデータのその1です。

{
    "id": 1,
    "name": "taro",
    "sikaku": [
        "基本",
        "応用"
    ]
}

作成するJSONデータのその2です。

{
    "id": 2,
    "name": "jiro"
}

Javaオブジェクトから上記JSONに変換するコードです。

package test1;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

class Syain {
	@JsonProperty("id")
	private int id;
	
	//@JsonPropertyの値がJSONの項目になる
	//(nではなくnameになる)
	@JsonProperty("name")
	private String n;
	
	@JsonProperty("sikaku")
	private List<String> sikaku; // 資格

	public void setId(int id) {
		this.id = id;
	}
	public void setN(String n) {
		this.n = n;
	}
	public void setSikaku(List<String> sikaku) {
		this.sikaku = sikaku;
	}
}
public class Test1 {
	public static void main(String[] args) {

	//Javaオブジェクトの生成
	Syain syain1 = new Syain();
	Syain syain2 = new Syain();
	
	//Javaオブジェクトに値をセット
	List<String> sikaku = new ArrayList<>();
	sikaku.add("基本");
	sikaku.add("応用");
	
	syain1.setId(1);
	syain1.setN("taro");
	syain1.setSikaku(sikaku);
	
	syain2.setId(2);
	syain2.setN("jiro");
	
	ObjectMapper mapper = new ObjectMapper();
    
	try {
		//JavaオブジェクトからJSONに変換
		String testJson1 = mapper.writeValueAsString(syain1);
		String testJson2 = mapper.writeValueAsString(syain2);
		
		//JSONの確認
		System.out.println(testJson1); 
		//{"id":1,"name":"taro","sikaku":["基本","応用"]}
		
		System.out.println(testJson2); 
		//{"id":2,"name":"jiro","sikaku":null}
		
	} catch (JsonProcessingException e) {
		e.printStackTrace();
	}
	}
}

9,14,17行目の@JsonPropertyは、JSONの項目になります。
18行目は、リストです。
53,54行目は、JavaオブジェクトからJSONに変換しています。

JSONのキー項目を指定して値を取得する

サンプルで使用するJSONデータです。

{
    "id": 1,
    "name": "taro",
    "sikaku": [
        "基本",
        "応用"
    ]
}

上記JSONのキー項目を指定して値を取得するコードです。

package test1;
import java.io.IOException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test1 {
	public static void main(String[] args) {

		//JSONのデータ1
        JsonNode node1;
		String testJson1 =
		"{\"id\":1, \"name\":\"taro\",\"sikaku\":[\"基本\",\"応用\"]}";
        ObjectMapper map1 = new ObjectMapper();

			try {
				node1 = map1.readTree(testJson1);
				
	            int id = node1.get("id").asInt();
	            System.out.println(id); // 1
	 
	            String name = node1.get("name").asText();
	            System.out.println(name);  // taro
	 
	            String sikaku1 = node1.get("sikaku").get(0).asText();
	            System.out.println(sikaku1); // 基本
	            String sikaku2 = node1.get("sikaku").get(1).asText();
	            System.out.println(sikaku2); // 応用
	            
	            for (JsonNode n : node1.get("sikaku")) {
	                System.out.println(n.asText()); //基本 応用
	            }
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
}

jackson-databind-2.x.x.jarのライブラリが必要です。
12行目はJSONです。値がリテラルなのでダブルコーテーションの前にエスケープシーケンスの\が入っています。
16行目は、readTreeメソッドでJSON文字列を引数にしています。
18行目は、JSONのキーのidを指定して値を取得しています。数値項目なのでasIntを使用しています。
21行目は、JSONのキーのidを指定して値を取得しています。文字列なのでasTextを使用しています。
24行目は、キーを指定したあとインデックスの0を指定して値を取得しています。
26行目は、キーを指定したあとインデックスの1を指定して値を取得しています。
29~31行目は、拡張for文で値を取得しています。
https://fasterxml.github.io/jackson-databind/javadoc/2.8/com/fasterxml/jackson/databind/ObjectMapper.html

関連の記事

JavaScript JSONをJavaScriptオブジェクトにする(parse)
JavaScript JavaScriptオブジェクトをJSONにする(stringify)

△上に戻る