Java Jackson JSON-RPC对泛型对象的反序列化

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

我正在尝试用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() {
    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);我想我已经尝试了这个无聊的方法,但没有成功。我会再试一次。谢谢!