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