【Java】Jacksonによる入れ子や配列を持つ複雑なJsonからJavaオブジェクトへの変換

java

 Jacksonは、JSONを処理するライブラリです。
 Jacksonライブラリを使用すれば、JSONからJavaオブジェクトまたはJavaオブジェクトからJSONに簡単に変換できます。

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

 JSONからJavaオブジェクトに変換する方法です。

 変換したいJSON

{
    "errorType": "ValidationException",
    "messages": {
        "common": [
            "E001:利用時間外です。",
            "E002:通信エラーが発生しました。"
        ],
        "user_id": [
            "E003:ユーザIDを入力してください。",
            "E004:パスワードを入力してください。"
        ]
    }
}

 マッピングするJavaクラス
 クラスを分けて書くか、インナークラスにするか、どちらもOKです。

public class SampleError {
    private String errorType;

    private messageDetail messages;

    public static class messageDetail {
        private List<String> common;
        private List<String> user_id;
    }
}

Json→Javaクラスの変換

String json = 上記変換したいJSON;
ObjectMapper mapper = new ObjectMapper();

try {
    errorList = mapper.readValue(json, SampleError.class);
} catch (JsonParseException | JsonMappingException | IOException e) {
    e.printStackTrace();
}
もう少し複雑なJSON

 構造は同じですが、キーは違うJSONを同一のJavaオブジェクトへマッピングしたいことがあるかもしれません。その際、どうすれば良いでしょうか? 

 例えば、以下のようなJSONです。エラー項目によって、キーが変わります。

{
    "errorType": "ValidationException",
    "messages": {
        "common": [    ←エラー項目は「common」である
            "E001:利用時間外です。",
            "E002:通信エラーが発生しました。"
        ]
    }
}
{
    "errorType": "ValidationException",
    "messages": {
        "user_id": [    ←エラー項目は「user_id」である
            "E003:ユーザIDを入力してください。",
            "E004:パスワードを入力してください。"
        ]
    }
}
{
    "errorType": "ValidationException",
    "messages": {
        "password": [    ←エラー項目は「password」である
            "E005:パスワードが間違いました。"
        ]
    }
}

 この場合、以下のようなJavaオブジェクトへマッピングできます。

public class SampleError {
    private String errorType;
    private messageDetail messages;

    //項目によって、どちらフィールドに値を入りますが、その以外のフィールドはnullである。
    public static class messageDetail {
        private List<String> common;
        private List<String> user_id;
        private List<String> password;
    }

    //エラーメエセージを取得するMethodを追加すれば便利です。
    public StringBuilder getErrMsg() {
        StringBuilder errMsgSB = new StringBuilder();
        if (common!=null) {
            for(String errMsg: common) {
                errMsgSB.append(errMsg);
                errMsgSB.append("<br>");
            }
            return errMsgSB;
        }
        if (common!=null) {
            for(String errMsg: common) {
                errMsgSB.append(errMsg);
                errMsgSB.append("<br>");
            }
            return errMsgSB;
        }
    }
}

コメント

タイトルとURLをコピーしました