当使用Apache Jersey与Jackson进行JSON序列化(在服务器和客户端上)时,我在反序列化通用List时遇到了问题.
我生成的JSON如下,"data"中的所有3个类都实现了"CheckStatusDetail":
{
"errorCode" : 0,
"errorMessage" : null,
"type" : "array",
"data" : [ {
"@class" : "com.rrr.base.status.module.dto.DiscoveryAgentCheckStatusDetail",
"serverInfo" : {
"@class" : "com.rrr.base.util.discovery.config.xml.XMLServerInfo",
"name" : "java",
"location" : "THEO",
"description" : "sddgs",
"group" : "java",
"aliases" : [ "mercury" ]
}
}, {
"@class" : "com.rrr.base.status.module.dto.MongoDBCheckStatusDetail",
"addresses" : [ "localhost:27017" ],
"version" : "2.5",
"connected" : true
}, {
"@class" : "com.rrr.base.status.module.dto.NetworkCheckStatusDetail",
"splitBrain" : false
} ],
"count" : 3,
"status" : 0
}
Run Code Online (Sandbox Code Playgroud)
生成此JSON的对象看起来像这样,我在客户端使用相同的类:
public class …Run Code Online (Sandbox Code Playgroud) 我可能在这里瞎了一些人,但无论如何我都会开枪.
我知道我能做到:
Class<Response> c = Response.class;
Run Code Online (Sandbox Code Playgroud)
获取对象的类.假设Response对象是Response<T>我想要执行以下操作
Class<Class<User>> c = Response<User>.class;
Run Code Online (Sandbox Code Playgroud)
我的完整问题:
public class RequestHelper<T> extends AsyncTask<String, Response, T> {
@Override
protected T doInBackground(String... strings) {
...
Response <T> r = objectMapper.readValue( result, Response.class );
return r .getResponse();
}
}
//and
public class Response <R> {
private R response;
public R getResponse() {
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
但是上面的参数尚未在赋值中指定.理论上,正确的方法需要:
public class RequestHelper<T> extends AsyncTask<String, Response, T> {
@Override
protected T doInBackground(String... strings) {
...
Response <T> r = objectMapper.readValue( …Run Code Online (Sandbox Code Playgroud) 我在使用 Jackson 序列化为 XML 时似乎遇到了问题。我的代码如下:
测试容器
package com.test;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonProperty;
public class TestContainer {
private String testContainerID;
private String testContainerMessage;
private ArrayList<TestChild> testContainerChildren;
@JsonProperty("TestContainerID")
public String getTestContainerID() {
return testContainerID;
}
@JsonProperty("TestContainerID")
public void setTestContainerID(String testContainerID) {
this.testContainerID = testContainerID;
}
@JsonProperty("TestContainerMessage")
public String getTestContainerMessage() {
return testContainerMessage;
}
@JsonProperty("TestContainerMessage")
public void setTestContainerMessage(String testContainerMessage) {
this.testContainerMessage = testContainerMessage;
}
@JsonProperty("TestContainerChildren")
public ArrayList<TestChild> getTestContainerChildren() {
return testContainerChildren;
}
@JsonProperty("TestContainerChildren")
public void setTestContainerChildren(ArrayList<TestChild> testContainerChildren) {
this.testContainerChildren = testContainerChildren;
}
} …Run Code Online (Sandbox Code Playgroud) 多年来,我一直在使用 Jackson 来序列化/反序列化对象,并且总是发现使用TypeReference<T>反序列化List等不必要地复杂。我创建了一个简单的辅助函数:
public static <T> TypeReference<List<T>> list() {
return new TypeReference<List<T>>(){}
}
Run Code Online (Sandbox Code Playgroud)
预期用途:
List<Foo> foos = objectMapper.readValue(json, list());
Run Code Online (Sandbox Code Playgroud)
它有效!的种类。通过调试器进行检查时,不是 的列表Foo,而是 的列表LinkedHashMap。我知道ObjectMapper反序列化为LinkedHashMap类型Object,我在这里阅读了解释:
但是,为什么它能够分配List<LinkedHasMap>给 a List<Foo>?至少不应该是某种ClassCastException吗?
另外,有没有办法用Java的类型系统来做到这一点?
注意:以下方法声明具有相同的问题,这是有道理的,因为不需要T确定附加参数:
public static <T> TypeReference<List<T>> listOf(Class<T> ignored) {
return new TypeReference<List<T>>(){}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将Json数组反序列化为对象的ArrayList.我找到了一些关于我正在尝试做什么的文档,但是我在编译时遇到了错误.
以下是我试图用Jackson 2.2.2来解决它的方法:
ArrayList<Friends> list = objectMapper.readValue(result, new TypeReference<ArrayList<Friends>>() {});
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
The method readValue(String, Class<T>) in the type ObjectMapper is not applicable for the arguments (String, new TypeReference<ArrayList<Friends>>(){})
Run Code Online (Sandbox Code Playgroud)
我猜测我读过的一些参考文献是基于杰克逊的旧版本.如何在Jackson 2.2 +中实现这一目标