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

时间:2011-02-14 13:13:13

标签: java json jackson json-rpc

我正在尝试用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)

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

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

任何人都可以帮我吗?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

在github上查看jsonrpc4j:

https://github.com/briandilley/jsonrpc4j

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

我在对象中添加了一个字段,因此在构建对象时,我正在使用类名设置字段值,在反序列化时我正在使用 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))

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

希望这有帮助