はじめに
この実験では、Jackson のObjectMapper
クラスを使ってオブジェクトを JSON にマッピングし、JSON をオブジェクトにマッピングする方法を学びます。DemoClass
という簡単な Java クラスを使って、JSON データの読み書きに関する様々な技術を学びます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Jackson のObjectMapper
クラスを使ってオブジェクトを JSON にマッピングし、JSON をオブジェクトにマッピングする方法を学びます。DemoClass
という簡単な Java クラスを使って、JSON データの読み書きに関する様々な技術を学びます。
~/project
ディレクトリに新しいプロジェクトを作成し、新しい DemoClass
Java クラスを作成します。以下のコードを DemoClass.java
コード ファイルに貼り付けます。
import java.util.Date;
public class DemoClass {
private String field1;
private Double field2;
private Date dateField;
// コンストラクタ
DemoClass() {}
DemoClass(String field1, Double field2, Date dateField) {
this.field1 = field1;
this.field2 = field2;
this.dateField = dateField;
}
// ゲッターとセッター
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public Double getField2() {
return field2;
}
public void setField2(Double field2) {
this.field2 = field2;
}
public Date getDateField() {
return dateField;
}
public void setDateField(Date dateField) {
this.dateField = dateField;
}
}
以下のコマンドを使用して DemoClass
Java クラスをコンパイルします。
javac DemoClass.java
ObjectMapper
クラスの readValue()
メソッドを使って、JSON ファイルからデータをオブジェクトに読み取ることができます。私たちの JSON ファイルには、単一のオブジェクトのプロパティと値のペアが含まれています。
demo.json
という新しいファイルを作成し、以下の JSON コンテンツを貼り付けます。
{
"field1": "Sample-1",
"field2": 20.21,
"dateField": "2021-07-30T14:20:30.000Z"
}
以下のコードを使って JSON ファイルを読み取り、DemoClass
オブジェクトにマッピングします。
import java.io.File;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectMapperDemo {
public static void main(String[] args) {
try {
String filePath = "demo.json";
File file = new File(filePath);
ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DemoClass obj = objMapper.readValue(file, DemoClass.class);
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
} catch (Exception e) {
System.out.println(e);
}
}
}
出力は以下の通りになります。
Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021
JSON 文字列からデータをオブジェクトに読み取ることができます。ObjectMapper
クラスの readValue()
メソッドを使用します。このメソッドには クラス型 も渡す必要があります。
JSON 文字列からデータを読み取るために、以下のコードを追加します。
String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";
ObjectMapper objMapper = new ObjectMapper();
DemoClass obj = objMapper.readValue(jsonString, DemoClass.class);
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
出力は以下の通りになります。
Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021
URL からオブジェクトを読み取ることも非常に簡単です。URL オブジェクトとクラス型を readValue()
メソッドに渡す必要があります。
JSON URL からオブジェクトを読み取り、マッピングするために、以下のコードを追加します。
import java.net.URL;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectMapperDemo {
public static void main(String[] args) {
try {
URL jsonFileUrl = new URL("file:demo.json");
ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DemoClass obj = objMapper.readValue(jsonFileUrl, DemoClass.class);
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
} catch (Exception e) {
System.out.println(e);
}
}
}
出力はステップ 2 と同じになります。
文字列が JSON 形式で複数のオブジェクト データ(配列として)を含んでいるとします。ObjectMapper
クラスを使用して、このすべてのデータを DemoClass
型の配列に読み取ることができます。
JSON 文字列配列からオブジェクト配列にオブジェクトを読み取るために、以下のコードを追加します。
String jsonString = " [{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}," +
" {\"field1\":\"Sample-2\",\"field2\":22.55,\"dateField\":\"2021-07-31T14:20:30.000Z\"}]";
ObjectMapper objMapper = new ObjectMapper();
DemoClass[] objectArr = objMapper.readValue(jsonString, DemoClass[].class);
for (DemoClass obj : objectArr) {
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
System.out.println();
}
出力は以下の通りになります。
Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021
Field1: Sample-2
Field2: 22.55
DateField: Sat Jul 31 14:20:30 UTC 2021
固定サイズのオブジェクト配列にデータを読み取りたくない場合、オブジェクトをリストに読み取ることができます。
JSON 文字列配列からオブジェクトをオブジェクト リストに読み取るために、以下のコードを追加します。
String jsonString = " [{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}," +
" {\"field1\":\"Sample-2\",\"field2\":22.55,\"dateField\":\"2021-07-31T14:20:30.000Z\"}]";
ObjectMapper objMapper = new ObjectMapper();
ArrayList<DemoClass> objectList = objMapper.readValue(jsonString, new TypeReference<ArrayList<DemoClass>>(){});
for (DemoClass obj : objectList) {
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
System.out.println();
}
出力はステップ 5 と同じになります。
JSON 文字列からデータをマップに読み取ることもできます。クラスの各プロパティがキーになり、プロパティ値が値になります。
JSON 文字列配列からデータをマップに読み取るために、以下のコードを追加します。
String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";
ObjectMapper objMapper = new ObjectMapper();
Map<String, Object> objectMap = objMapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {});
for (Map.Entry<String, Object> entry : objectMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
出力は以下の通りになります。
field1: Sample-1
field2: 20.21
dateField: 2021-07-30T14:20:30.000Z
JsonNode
クラスは、JSON を解析するためのより柔軟な方法を提供します。ObjectMapper
クラスの readTree()
メソッドを使用して、JSON を JsonNode
オブジェクトに読み取ることができます。
JsonNode
オブジェクトに JSON を読み取るために、以下のコードを追加します。
String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";
ObjectMapper objMapper = new ObjectMapper();
JsonNode node = objMapper.readTree(jsonString);
System.out.println("Field1: " + node.get("field1").asText());
System.out.println("Field2: " + node.get("field2").asDouble());
System.out.println("DateField: " + node.get("dateField").asText());
出力はステップ 2 と同じになります。
予期しない入力と対応できるように、ObjectMapper
を構成することができます。
ObjectMapper
を構成して新しいプロパティを無視するようにするには、以下のコードを追加します。
String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"field3\":\"Unknown\"}";
ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DemoClass obj = objMapper.readValue(jsonString, DemoClass.class);
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
出力はステップ 2 と同じになります。
デフォルトでは、ObjectMapper
は java.util.date
を long 型の値にマップします。この long 型の値は、1970 年 1 月 1 日以降に経過したミリ秒数です。
SimpleDateFormat
を使用して日付形式を定義し、java.util.date
をシリアライズする方法を示すには、以下のコードを追加します。
ObjectMapper objMapper = new ObjectMapper();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
objMapper.setDateFormat(dateFormat);
DemoClass obj = new DemoClass("Sample-1", 20.21, new Date());
String jsonString = objMapper.writeValueAsString(obj);
System.out.println(jsonString);
出力は以下の通りになります。
{"field1":"Sample-1","field2":20.21,"dateField":"30-07-2021"}
この実験では、Jackson の ObjectMapper
クラスを使ってオブジェクトを JSON にマッピングし、JSON をオブジェクトにマッピングする方法を学びました。JSON ファイルをオブジェクトに読み込む方法、JSON 文字列からデータを読み取り、オブジェクトにマッピングする方法、および JSON 文字列配列からオブジェクトのリストまたは配列に読み取る方法を学びました。また、JSON 文字列を JsonNode
オブジェクトに読み込み、新しいプロパティやプリミティブ型の null 値を無視するように ObjectMapper
を構成する方法も学びました。最後に、日付の扱い方と、java.util.date
をシリアライズする際に特定の日付形式を使用する方法を学びました。