1

我有以下JSON。我正在使用 JacksonParser解析它

 {
  "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.

请帮忙

4

2 回答 2

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),并且从该类型的元素中可用。

于 2012-12-05T00:12:18.280 回答
0

试试这个::

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

String code = objJSON.get("code");
于 2012-11-30T13:47:02.493 回答