以下のクラスと JSON 文字列の例を使用して、それがどのように機能するかを説明しましょう。以下のような 2 つのクラスがあるとします。
class TestWrapper<T> {
private List<Map<String, T>> list = new ArrayList<Map<String, T>>();
public List<Map<String, T>> getList() {
return list;
}
public void setList(List<Map<String, T>> list) {
this.list = list;
}
}
class Entity {
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
入力としてのJSON文字列の下:
{
"list" : [ {
"entity" : {
"id" : 0
}
} ]
}
以下のコードを使用して上記の JSON を逆シリアル化しようとすると、Jackson が不明な型をMap
クラスに逆シリアル化することがわかります。
TestWrapper<?> result = mapper.readValue(json, TestWrapper.class);
System.out.println(result.getList().get(0).get("entity").getClass());
上記のプログラムは次のように出力します:
class java.util.LinkedHashMap
値のタイプを定義したい場合は、JSON デシリアライゼーション プロセスを使用しMap
てビルドし、提供する必要があります。TypeFactory
TypeFactory typeFactory = mapper.getTypeFactory();
JavaType type = typeFactory.constructParametricType(TestWrapper.class, Entity.class);
TestWrapper<Entity> result = mapper.readValue(json, type);
System.out.println(result.getList().get(0).get("entity").getClass());
上記のプログラムは次のように出力します:
class your.package.Entity
ご覧のとおり、複雑なオブジェクトを提供するジェネリック型をJavaType
逆シリアル化プロセスに提供できます。