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

JavaのJacksonでJSONとオブジェクトを変換するサンプルです。
(確認環境:JDK 8、Eclipse 4.8)

目次 Jacksonとは
  Jacksonの取得方法
JSONからJavaオブジェクトに変換
  配列のJSONからJavaオブジェクトに変換
  JavaオブジェクトからJSONに変換
JSON>Javaオブジェクトで値変更>JSON

Jacksonとは

Jacksonとは、JSONを処理するライブラリです。
JSONからJavaオブジェクトまたはJavaオブジェクトからJSONに変換します。
ライセンスは、Apache License 2.0です。

以下は、Jackson Projectのリンクです。
https://github.com/FasterXML/jackson

Jacksonの取得方法

1.Mavenで取得する場合

pom.xmlの<dependencies>の間に以下のコードを追加します。

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

Mavenで取得する手順は、以下を参照願います。
Eclipse Mavenでjarを取得(Java)

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

 

2.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オブジェクトに変換するサンプルです。

1.JSONデータ

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

sikakuは配列を持っています。

 

2.JSONデータを受けるJavaのクラス (SyainData .java)

package test1;

import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;

public class SyainData {

	private String id;

	@JsonProperty("name")
	private String romaji;

	private List<String> sikaku;

	public String getId() {
		return id;
	}
	public String getRomaji() {
		return romaji;
	}
	public List<String> getSikaku() {
		return sikaku;
	}
}

10行目の@JsonPropertyは、JSONのnameの値をJavaのromajiに値をセットします。

 

3.JSONをJavaオブジェクトに変換するクラス (SyainService .java)

package test1;

import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class SyainService {
	public static void main(String[] args) {
		String jsonData = 
		"{\"id\": \"1\",\"name\": \"suzuki\",\"sikaku\": [\"基本\",\"応用\"]}";

		ObjectMapper mapper = new ObjectMapper();
		try {
			SyainData syain = mapper.readValue(jsonData, SyainData.class);

			System.out.println(syain.getId()); // 1
			System.out.println(syain.getRomaji()); // suzuki
			System.out.println(syain.getSikaku().get(0)); // 基本
			System.out.println(syain.getSikaku().get(1)); // 応用

		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

11行目は、ダブルコーテーションの前にエスケープシーケンス(\)が入っています。
15行目は、JSONからJavaオブジェクトに変換しています。

 

配列のJSONからJavaオブジェクトに変換

1.配列のJSONデータ

配列のjsonデータです。最初と最後に[ ]があります。

[
   {
    "id": "1",
    "name": "suzuki",
    "sikaku": ["基本","応用"]
   },
   {
    "id": "2",
    "name": "tanaka",
    "sikaku": ["基本"]
   }
]

2.配列のJSONデータを受けるJavaのクラス (SyainData.java)

package test1;

import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;

public class SyainData {

	private String id;

	@JsonProperty("name")
	private String romaji;

	private List<String> sikaku;

	public String getId() {
		return id;
	}
	public String getRomaji() {
		return romaji;
	}
	public List<String> getSikaku() {
		return sikaku;
	}
}

10行目の@JsonPropertyは、JSONのnameの値をJavaのromajiに値をセットします。

 

3.配列のJSONをJavaオブジェクトに変換するクラス (SyainService.java)

package test1;

import java.io.IOException;
import java.util.List;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class SyainService {
	public static void main(String[] args) {
		String jsonData = ""
		+ "[{\"id\": \"1\",\"name\":\"suzuki\",\"sikaku\":[\"基本\",\"応用\"]},"
		+ "{\"id\": \"2\",\"name\": \"tanaka\",\"sikaku\": [\"基本\"]}]";

		ObjectMapper mapper = new ObjectMapper();
		//List<SyainData> syainData = null;
		try {
			SyainData[] syainData = mapper.readValue(jsonData, SyainData[].class);
			//syainData = mapper.readValue(jsonData, new TypeReference<>(){});
			for (SyainData syain : syainData) {
				System.out.println(syain.getId());
				System.out.println(syain.getRomaji());
				System.out.println(syain.getSikaku());
			}
		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

13,14行目は、ダブルコーテーションの前にエスケープシーケンス(\)が入っています。
19行目は、JSONからJavaオブジェクトに変換しています。SyainData[]と配列にしています。

リストに変換する場合は、17,20行目のコメントを外し19行目をコメントにします。
※17,19,20行目のコメントの付け外しをしていると「型 List<E> は不可視です」が出ることがありました。1行ずつコメントを付け外して保存していると消えました。

 

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

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

1.Javaのクラス (SyainData.java)

package test1;

import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;

public class SyainData {
	@JsonProperty("id")
	private String id;

	@JsonProperty("name")
	private String romaji;
	
	@JsonProperty("sikaku")
	private List<String> sikaku;

	public void setId(String id) {
		this.id = id;
	}
	public void setRomaji(String romaji) {
		this.romaji = romaji;
	}
	public void setSikaku(List<String> sikaku) {
		this.sikaku = sikaku;
	}
}

JSON出力時は、@JsonPropertyをセットします。

 

2.JavaオブジェクトからJSONに変換するクラス (SyainService.java)

package test1;

import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

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

		SyainData syainData1 = new SyainData();
		syainData1.setId("1");
		syainData1.setRomaji("suzuki");
		List<String> sikaku1 = new ArrayList<>();
		sikaku1.add("基本");
		sikaku1.add("応用");
		syainData1.setSikaku(sikaku1);
		
		SyainData syainData2 = new SyainData();
		syainData2.setId("2");
		syainData2.setRomaji("tanaka");
		List<String> sikaku2 = new ArrayList<>();
		sikaku2.add("ネットワーク");
		syainData2.setSikaku(sikaku2);

		List<SyainData> syainList = new ArrayList<>();
		syainList.add(syainData1);
		syainList.add(syainData2);
		
		ObjectMapper mapper = new ObjectMapper();
		try {
			String jsonData = mapper.writeValueAsString(syainList);
			System.out.println(jsonData);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
	}
}

11~24行目は、Javaオブジェクトを生成し値をセットしています。
32行目は、JavaオブジェクトからJSONに変換しています。

実行時は以下のJSONが出力されます。

[{"id":"1","name":"suzuki","sikaku":["基本","応用"]},{"id":"2","name":"tanaka","sikaku":["ネットワーク"]}]

JSON>Javaオブジェクトで値変更>JSON

package test1;

import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test1 {
	public static void main(String[] args) {
		// JSON文字列
		String jsonData = "" + "[{\"id\": \"1\",\"name\":\"suzuki\",\"sikaku\":[\"基本\",\"応用\"]},"
				+ "{\"id\": \"2\",\"name\": \"tanaka\",\"sikaku\": [\"基本\"]}]";
		
		// Javaオブジェクト
		SyainData[] syainData = null;
		ObjectMapper mapper = new ObjectMapper();
		try {
			syainData = mapper.readValue(jsonData, SyainData[].class);

			for (SyainData syain : syainData) {
				syain.setId("1122");
				System.out.println(syain.getId());
				System.out.println(syain.getRomaji());
				System.out.println(syain.getSikaku());
			}
		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		// オブジェクトをJSON文字列に戻す
		try {
			jsonData = mapper.writeValueAsString(syainData);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		System.out.println(jsonData);

	}
}

JSONからJavaオブジェクトにして値を変更しJSONに戻しています。+

実行時は以下のJSONが出力されます。

[{"id":"1122","sikaku":["基本","応用"],"name":"suzuki"},{"id":"1122","sikaku":["基本"],"name":"tanaka"}]

関連の記事

JavaScript parse JSONから値を取得するサンプル
JavaScript stringify オブジェクトをJSONにする

△上に戻る