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にする