0

我有这个结构

 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 值的对象类型?如果它是可配置的,我如何像使用注释一样配置它?

4

1 回答 1

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

如果要定义值的类型,则必须使用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对象提供给反序列化过程。

于 2013-07-31T22:15:35.147 回答