我关注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
。
请帮忙
答案 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");