【Java】JacksonでJson⇄Javaオブジェクトを変換する

Java

JavaでJson⇄Javaオブジェクトを変換する

最近業務の改修作業でJavaを使う機会があったので、備忘録として残しておきます。

Json⇄Javaの変換はいくつかライブラリがあると思いますが、既存のプロジェクトでJacksonが疲れていたので、今回はJacksonでのパース方法をまとめておきます。

JSON→Javaオブジェクト

APIで取得した結果のJSONをJavaオブジェクトに変換する時などに使います。

シンプルなやつ

キレイに型をつけてパースできないのですが、1階層でフィールドも少なめだったら、JsonNodeとして扱えば楽です。

package jp.sample;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        String json = "{\"name\": \"hogehoge\", \"age\": 40}";

        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(json);

        System.out.println(node.get("name").textValue());
    }
}
hogehoge

JSON→リスト

JSONをJavaのリストに変換したい時です。

シンプルな場合

シンプルなやつは、new TypeReferenceでやると楽です。

package jp.sample;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import java.util.List;
import java.util.Map;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        String json = "{\"items\": [\"hoge\", \"hogehoge\"] }";

        ObjectMapper mapper = new ObjectMapper();
        Map<String, List<String>> nodeMap = mapper.readValue(json, new TypeReference<Map<String, List<String>>>(){});

        List<String> nodeList = nodeMap.get("items");
        for (String s : nodeList) {
            System.out.println(s);
        }
    }
}
hoge
hogehoge

複雑な場合

フィールドも増えてきて、少し複雑になってきたら、Classにマップしてやると楽です。

package jp.sample;

import java.util.List;

public class Hoge {
    public int id;
    public String name;
    public List<String> items;
}

package jp.sample;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        String json = "{\"id\": 333, \"name\": \"hogehoge\", \"items\": [\"hoge\", \"hogehoge\"] }";

        ObjectMapper mapper = new ObjectMapper();
        Hoge hoge = mapper.readValue(json, Hoge.class);

        System.out.println(hoge.id);
        System.out.println(hoge.name);

        for (String s : hoge.items) {
            System.out.println(s);
        }
    }
}

333
hogehoge
hoge
hogehoge

ネストされたり、複雑になってきたり

ネストされたり複雑になってきたりしたら、逆にJsonNodeでやると楽です。

クラスだと逆にマップするのも面倒になったりするので、型をキレイに付けようとせず、値だけ取り出して整形するぐらいなら、これが結局は自由度が高くて楽かもです。

package jp.sample;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        String json = "{" +
                "\"id\": 333, " +
                "\"hoge\": {" +
                    "\"name\": \"hogehoge1\"," +
                    "\"age\": 30" +
                "}" +
             " }";

        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readValue(json, JsonNode.class);

        System.out.println(node.get("id"));

        JsonNode hoge = node.get("hoge");

        JsonNode nameNode = hoge.get("name");
        String name = nameNode.asText();
        System.out.println(name);

        JsonNode ageNode = hoge.get("age");
        String age = ageNode.asText();
        System.out.println(age);
    }
}

333
hogehoge1
30

Javaオブジェクト→JSON文字列

JavaオブジェクトをJSON文字列にして、クライアントに返したい時などには、こんな感じです。

package jp.sample;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        List<String> hogeList = new ArrayList<String>();
        hogeList.add("hoge");
        hogeList.add("hogehoge");

        Hoge hoge = new Hoge();
        hoge.id = 33333333;
        hoge.name = "hogege";
        hoge.items = hogeList;

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(hoge);

        System.out.println(json);
    }
}

{"id":33333333,"name":"hogege","items":["hoge","hogehoge"]}

参考サイト

まとめ

今回は、JavaのJacksonを使用して、Json⇄Javaオブジェクトを変換する方法について紹介しました!

Json⇄Javaオブジェクトを変換に使うライブラリはいくつかありますが、この変換は結構やる機会があると思うので、使いこなせるようにしておきたいですね!

オススメの関連商品

Note一覧

コメント

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