繁体   English   中英

杰克逊JSON-RPC对通用对象的deserilisation

[英]Jackson JSON-RPC deserilisation to generic Object

我试图用Jackson反序列化JSON-RPC对象。 JSON-RPC的格式是:

{“result”:“something”,“error”:null,“id”:1}

在我的例子中,result属性是一个通用的Object。

我有一堂课来反响回应:

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;
}    

}

上述案例的响应中的结果对象将是:

"result": {"condition":"test","usage":"optional"}

我试过了:

mapper.readValue(result,objectClass)

结果是结果的JsonNode intance(由于某种原因是LinkedHashMap)和objectClass我希望它反序列化的类。 但这不起作用。

我整天都用不同的方式捣乱了我的头脑,但我可能不明白杰克逊的工作原理。

谁能帮我这个?

先感谢您。

在github上查看jsonrpc4j:

https://github.com/briandilley/jsonrpc4j

我理解原始问题是关于“结果”对象的多态反序列化。

Jackson现在有一个可用的内置机制,使用@JsonTypeInfo@JsonSubTypes注释。 ObjectMapper有可用的方法作为使用注释的替代方法。)更多信息可在http://wiki.fasterxml.com/JacksonPolymorphicDeserialization的官方文档中找到 另外,我在http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html上发布了一些使用示例。

但是,如果您反序列化JSON,在目标对象中没有通过某个名称标识类型的元素,那么您将陷入自定义反序列化,您必须根据某些对象内容确定类型应该是什么。 我在上面链接的同一博客中的最​​后一个例子之一就是使用目标对象中特定JSON元素的存在来确定类型的方法,演示了这种方法。

我有同样的问题,这是我的解决方案。

我在对象中添加了一个字段,因此在构建对象时,我使用类名设置字段值,在反序列化时我使用的是mapper.convertvalue(object, Class.forName(field value)

在您的情况下, private Object result;

在结果对象中添加一个字段“className”,序列化类时将值“className”设置为您要作为结果对象处理的类的名称。

反序列化对象时JsonRpcResponse jsonResp = mapper.readValue(response, JsonRpcResponse.class);

在jsonResp中你将拥有Object result, String className ,这里的对象是linkedhashmap类型

现在转换为您的对象

objectmapper.convertValue(result, Class.forName(className))

上面的代码将为您提供所需的通用对象。

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM