Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【Java】Jacksonを使ってJSON文字列←→オブジェクト変換を行う

Jacksonとは

github.com

JacksonJavaで使えるJSONライブラリです。
JSON形式の文字列をJavaのオブジェクトに直接マッピングしたり、逆にJavaオブジェクトをJSON文字列に変換できたりします。

HTTPレスポンスをパースしたりオブジェクトをBase64エンコーディングする時などに便利です。

Usage

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

    public static class Obj {
        private String name;
        private int value;

        public Obj(){
        }

        public Obj(String name, int value){
            this.name = name;
            this.value = value;
        }
    }

    public static void main(String... args){
        Obj obj = new Obj("apple", 100);
        String json = getJSONFromObj(obj);
        Obj newObj = getObjFromJSON(json);
    }

    // JavaオブジェクトをJSONに変換
    private String getJSONFromObj(Obj obj) {

        String json = null;
        ObjectMapper mapper = new ObjectMapper();
        try {
            json = mapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        return json;
    }

    // JSONをJavaオブジェクトに変換
    private Obj getObjFromJSON(String json) {
        ObjectMapper mapper = new ObjectMapper();
        Obj obj = null;
        try {
            obj = mapper.readValue(json, Obj.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }

}

パース時の注意

JacksonのObjectMapperでデシリアライズする際のクラスは、

  • 引数なしコンストラクタが定義されていなければならない
  • インナークラスはstaticでなければならない(アウタークラスがインスタンス化されないとクラス定義がオンメモリにならないため)
  • JSONプロパティはすべて変換後のクラスメンバに存在しなければならない

という制約をクリアしている必要があります。
これらの制約に反していた場合には例外がスローされます。

具体的な注意点は、こちらの方の記事でとてもわかり易くまとめてあったので引用させていただきます。

qiita.com