Posted at

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

More than 5 years have passed since last update.

以下の 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>>() {});
}
}