Java 如何将Jackson与嵌套泛型一起使用?
我使用改装和Jackson。有这样一个POJO:Java 如何将Jackson与嵌套泛型一起使用?,java,android,json,jackson,Java,Android,Json,Jackson,我使用改装和Jackson。有这样一个POJO: public class QuotationHttpResult<T> { private int code; private Result result; public T getData(){ return result == null ? null : result.getData(); } public int getCode() { return c
public class QuotationHttpResult<T> {
private int code;
private Result result;
public T getData(){
return result == null ? null : result.getData();
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Result getResult() {
return result;
}
public void setResult(Result result) {
this.result = result;
}
class Result{
private T data;
public T getData() {
return data;
}
}
}
转换代码:
ObjectMapper mapper = new ObjectMapper();
QuotationHttpResult<List<MyClass>> result = mapper.readValue(json,new TypeReference<QuotationHttpResult<List<MyClass>>>() {});
我看到了这个问题,当我不嵌套泛型时,一切都很顺利,但是当泛型嵌套时,我该怎么做呢?您可以尝试使用。我认为这是有问题的反序列化的最佳方式…首先,您应该使
结果
静态()或将其移出QuotationHttpResult
,以便jackson可以看到数据类型。因此,您必须使其成为通用的Result
。您还必须向MyClass
POJO添加getter和setter,或者为jackson添加注释
以下是演示:
public class QuotationHttpResult<T> {
private int code;
private Result<T> result;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Result<T> getResult() {
return result;
}
public void setResult(Result<T> result) {
this.result = result;
}
public static class Result<T>{
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
}
public class MyClass {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws IOException {
String json = " {\"code\": 0,\n" +
" \"result\": {\n" +
" \"data\": [\n" +
" {\n" +
" \"id\": \"1000\",\n" +
" \"name\": \"tecent\"\n" +
" }, \n" +
" {\n" +
" \"id\": \"1001\",\n" +
" \"name\": \"alibaba\"\n" +
" }\n" +
" ]\n" +
" }\n" +
" }";
ObjectMapper mapper = new ObjectMapper();
QuotationHttpResult<MyClass> result = mapper.readValue(json,new TypeReference<QuotationHttpResult<List<MyClass>>>() {});
System.out.println(result);
}
public类QuotationHttpResult{
私有整数码;
私人结果;
公共int getCode(){
返回码;
}
公共无效设置码(整数码){
this.code=代码;
}
公共结果getResult(){
返回结果;
}
公共void setResult(结果){
this.result=结果;
}
公共静态类结果{
私有T数据;
公共T getData(){
返回数据;
}
公共无效设置数据(T数据){
这个数据=数据;
}
}
}
公共类MyClass{
私有字符串id;
私有字符串名称;
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
公共静态void main(字符串[]args)引发IOException{
字符串json=“{\'code\”:0\n+
“\”结果\“:{\n”+
“\“数据\”:[\n”+
“{\n”+
“\“id\:\“1000\”,\n”+
“\”名称\“:\”腾讯\“\n”+
},\n+
“{\n”+
“\“id\”:\“1001\”,\n”+
“\”名称\“:\”阿里巴巴\“\n”+
“}\n”+
“]\n”+
“}\n”+
" }";
ObjectMapper mapper=新的ObjectMapper();
QuotationHttpResult result=mapper.readValue(json,新类型引用(){});
系统输出打印项次(结果);
}
此处的数据
字段不会是MyClass
类型。这将是ArrayList
破坏所有类型安全。
class MyClass{
String id;
String name;
}
public class QuotationHttpResult<T> {
private int code;
private Result<T> result;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Result<T> getResult() {
return result;
}
public void setResult(Result<T> result) {
this.result = result;
}
public static class Result<T>{
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
}
public class MyClass {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws IOException {
String json = " {\"code\": 0,\n" +
" \"result\": {\n" +
" \"data\": [\n" +
" {\n" +
" \"id\": \"1000\",\n" +
" \"name\": \"tecent\"\n" +
" }, \n" +
" {\n" +
" \"id\": \"1001\",\n" +
" \"name\": \"alibaba\"\n" +
" }\n" +
" ]\n" +
" }\n" +
" }";
ObjectMapper mapper = new ObjectMapper();
QuotationHttpResult<MyClass> result = mapper.readValue(json,new TypeReference<QuotationHttpResult<List<MyClass>>>() {});
System.out.println(result);
}