Jackson可以处理序列化和反序列化为java Object类型

时间:2013-07-31 06:13:49

标签: json jackson deserialization

我有这个结构

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

1 个答案:

答案 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对象提供给反序列化过程。