杰克逊用未知的属性名称反序列化泛型

时间:2012-11-30 13:41:28

标签: java android json jackson

我关注JSON。我正在使用 Jackson Parser

解析它
 {
  "code": 0,
  "response": {
    "pagination": {
        "page": 1,
        "limit": 20,
        "count": 5,
        "pageCount": 1
    },
   "random": [
      ....
     ]
  }
}

现在我为各种 POJO 对象创建了简单的random类。我期待3-4种不同类型的 random 对象。因此,我没有为不同类型的“随机”对象创建不同的包装类,而是创建了一个通用的

编辑类:

public class PaginatedResponse<E> {

   private Pagination pagination;
   private List<E> responseList;

   public Pagination getPagination() {
       return pagination;
   }

   public void setPagination(Pagination pagination) {
       this.pagination = pagination;
   }

   public List<E> getResponseList() {
       return responseList;
   }

   public void setResponseList(List<E> responseList) {
       this.responseList = responseList;
   }
}

现在我用它来映射,

  JsonNode tree = mapper.readTree(response);
  TypeReference<PaginatedResponse<LocationParent>> ref = new TypeReference<PaginatedResponse<LocationParent>>() {   };
  PaginatedResponse<LocationParent> resp = mapper.convertValue(tree.get("response"), ref);

但我无法映射responseList。我得到 pagination 对象,但responseList始终为空。现在,如何为property name动态提供responseList

请帮忙

2 个答案:

答案 0 :(得分:1)

变量值类型需要处理多态类型。仅通用类型无济于事,因为反序列化方面不知道要使用的类型。

您可以使用注释@JsonTypeInfo启用多态类型处理;但是在这种特殊情况下的一个问题是你需要List任意类型的东西 - 由于类型擦除,所有Java列表实际上只是List<Object>;元素没有打字。

如果是我,我可能会对PaginatedResponse进行子类化,只需在基类中添加@JsonTypeInfo,例如:

@JsonTypeInfo(...) // see javadocs for properties needed
public abstract class PaginatedResponse<T> {
  public Pagination pagination;
  // .. and so on
}

public class PaginatedFooResponse<Foo> { }

在这里使用子类的原因只是让反序列化器能够在给定响应对象类型的情况下找出元素类型。响应对象将具有类型(PaginatedFooResposne),并且可以从该类型的元素中获得。

答案 1 :(得分:0)

试试这个::

JSONObject objJSON = JSONObject.fromString("urString");

String code = objJSON.get("code");