Java Jackson JSON-RPC对泛型对象的反序列化
我正在尝试用Jackson反序列化JSON-RPC对象。JSON-RPC的格式为: {“result”:“something”,“error”:null,“id”:1} 在我的例子中,result属性是泛型对象 我有一个反序列化响应的类:Java Jackson JSON-RPC对泛型对象的反序列化,java,json,jackson,json-rpc,Java,Json,Jackson,Json Rpc,我正在尝试用Jackson反序列化JSON-RPC对象。JSON-RPC的格式为: {“result”:“something”,“error”:null,“id”:1} 在我的例子中,result属性是泛型对象 我有一个反序列化响应的类: public class JsonRpcResponse { private Object result; private JsonRpcError error; private int id; public int getId() { retur
public class JsonRpcResponse {
private Object result;
private JsonRpcError error;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public JsonRpcError getError() {
return error;
}
public void setError(JsonRpcError error) {
this.error = error;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
我可以通过以下方式获得响应对象:
JsonRpcResponse jsonResp = mapper.readValue(response, JsonRpcResponse.class);
我希望有一个泛型方法,通过将要反序列化的对象(或类,如果需要)的类型传递给该方法来反序列化该结果对象。这样,我可以根据预期的响应传递任何类型的对象
例如,我有一个具有两个属性的类:
public class JsonEventProperties {
private String conditon;
private String usage;
public JsonEventProperties(String condition, String usage) {
this.conditon = condition;
this.usage = usage;
}
public JsonEventProperties() {
throw new UnsupportedOperationException("Not yet implemented");
}
public String getConditon() {
return conditon;
}
public void setConditon(String conditon) {
this.conditon = conditon;
}
public String getUsage() {
return usage;
}
public void setUsage(String usage) {
this.usage = usage;
}
}
对于上述情况,响应中的结果对象将是:
“结果”:{“条件”:“测试”,“用法”:“可选”}
我试过:
mapper.readValue(result,objectClass)
其中result是结果(出于某种原因是LinkedHashMap)的JsonNode形式,objectClass是我希望它反序列化到的类。但这是行不通的
我整天都在用各种不同的方法来做这件事,但我可能不知道杰克逊是谁
有人能帮我吗
提前感谢。在github上查看jsonrpc4j:
我理解最初的问题是关于“result”对象的多态反序列化 Jackson现在有了一个内置的机制,可以使用
@JsonTypeInfo
和@JsonSubTypes
注释来实现这一点。(有替代使用注释的方法。)有关更多信息,请访问官方文件。另外,我在网站上发布了一些这方面的使用示例
但是,如果在反序列化目标对象中没有通过某个名称标识类型的元素的JSON时遇到了困难,那么就需要进行自定义反序列化,在自定义反序列化中,必须根据某些对象内容确定类型应该是什么。我在上面链接的同一个博客中的最后一个示例演示了这种方法,使用目标对象中特定JSON元素的存在来确定类型。我也有同样的问题,这是我的解决方案 我又向对象添加了一个字段,因此在构建对象时,我使用类名设置字段值,在反序列化时使用类名
mapper.convertvalue(对象,类.forName(字段值)
就你而言
私有对象结果;
在结果对象中添加一个字段“className”,在序列化类的同时,将值“className”设置为您作为结果对象处理的类的名称
在反序列化对象时
jsonrpresponse-jsonResp=mapper.readValue(response,jsonrpresponse.class);
在jsonResp中,您将得到对象结果,字符串className
,这里的对象是linkedhashmap类型
现在转换为您的对象
objectmapper.convertValue(结果,类.forName(类名称))
上面的代码将为您获取所需的通用对象
希望这能有所帮助您好,我仍然在努力为这种类型的对象创建尽可能通用的反序列化函数。我想知道我是否只有结果对象(忘记其他)作为一个JSON字符串,有没有办法创建一个采用“result”类型并返回反序列化结果的方法?例如,如果结果是ArrayList,我知道我可以使用TypeReference“”技术来实现这一点。但是如果结果是CustomObject,这将如何工作?我不能使用TypeReference,可以吗?我将不胜感激您的反馈。谢谢!对于CustomObject,您仍然可以使用TypeReference技术。这不仅仅适用于一般集合。我在对自己问题的回答中发布了一个这样做的示例。这还包括一个使用上下文反序列化器的示例,对于您的情况,这可能是不必要的。我相信您的意思是:TypeRereference fooOfStringType=new TypeReference(){};Foo fooOfStringCopy2=mapper.readValue(fooOfStringJson,fooOfStringType);我想我已经尝试了这个无聊的方法,但没有成功。我会再试一次。谢谢!