LoginSignup
71
66

More than 5 years have passed since last update.

トップレベルが配列な JSON を、Jackson で POJO を含む List にデシリアライズする方法

Posted at

以下の JSON のように トップレベルの要素がオブジェクトではなく配列 であるケースにおいて、Jackson を用いて POJO を含む List オブジェクトにデシリアライズする方法をメモメモしておきます。

[
  {
    "foo": "ほげ",
    "bar": 1
  },
  {
    "foo": "ふが",
    "bar": 12
  }
]

答えは以下のとおり、 TypeReference を用いれば OK。

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;

import java.io.IOException;
import java.util.List;

/**
 * オブジェクトを含んだ配列の JSON を、POJO なオブジェクトを含むリストにデシリアライズするデモ。
 *
 * @author KOMIYA Atsushi
 */
public class ListDeserializationDemo {
    public static class MyPOJO {
        public String foo;
        public int bar;
    }

    public static void main(String[] args) throws IOException {
        String json = "[ {\"foo\": \"ほげ\", \"bar\": 1 }, {\"foo\": \"ふが\", \"bar\": 12 } ]";

        // これだと正しくデシリアライズできない
        // リストの要素にアクセスしようとしたところで ClassCastException が発生してしまう
        List<MyPOJO> pojos1 = new ObjectMapper().readValue(json, List.class);

        // このように、org.codehaus.jackson.type.TypeReference の具体的なクラスを定義してあげる必要がある
        List<MyPOJO> pojos2 = new ObjectMapper().readValue(json, new TypeReference<List<MyPOJO>>() {});
    }
}
71
66
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
66