Jackson ライブラリを使ったオブジェクトマッピング

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Jackson のObjectMapperクラスを使ってオブジェクトを JSON にマッピングし、JSON をオブジェクトにマッピングする方法を学びます。DemoClassという簡単な Java クラスを使って、JSON データの読み書きに関する様々な技術を学びます。

DemoClass を作成してコンパイルする

~/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

JSON ファイルからオブジェクトを読み取る

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 文字列からオブジェクトを読み取る

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

JSON URL からオブジェクトを読み取る

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 文字列配列からオブジェクト配列への読み取り

文字列が 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 文字列配列からオブジェクト リストへの読み取り

固定サイズのオブジェクト配列にデータを読み取りたくない場合、オブジェクトをリストに読み取ることができます。

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 文字列からデータをマップに読み取ることもできます。クラスの各プロパティがキーになり、プロパティ値が値になります。

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 の読み取り

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 を構成することができます。

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 と同じになります。

日付の扱い

デフォルトでは、ObjectMapperjava.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 をシリアライズする際に特定の日付形式を使用する方法を学びました。