我有这个结构
List<Map<String, Object>>
或者可以包装
public static class TestWrapper {
List<Map<String, Object>> list;
public TestWrapper() {
}
public List<Map<String, Object>> getList() {
return list;
}
public void setList(List<Map<String, Object>> list) {
this.list = list;
}
}
Jackson如何知道将值转换为什么类型的对象到Map值?如果它是可配置的,我如何配置它就像使用注释一样?
答案 0 :(得分:1)
让我用下面的类和示例JSON字符串解释它是如何工作的。假设我们有两个类如下:
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
如果要定义Map
值的类型,则必须使用TypeFactory
构建它,并提供给JSON反序列化过程。
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
对象提供给反序列化过程。