0

我正在尝试使用 Jackson 反序列化 JSON-RPC 对象。JSON-RPC 的格式为:

{“结果”:“某事”,“错误”:空,“id”:1}

在我的情况下,结果属性是一个通用对象。

我有一门用于对响应进行反序列化的课程:

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 实例(由于某种原因是 LinkedHashMap)和 objectClass 我希望它反序列化到的类。但这不起作用。

我整天都在用不同的方式来做这件事,但我可能不明白杰克逊是谁工作的。

谁能帮我这个?

先感谢您。

4

3 回答 3

1

查看 github 上的 jsonrpc4j:

https://github.com/briandilley/jsonrpc4j

于 2011-04-14T21:13:29.230 回答
1

我理解最初的问题是询问“结果”对象的多态反序列化。

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

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

于 2011-06-16T02:30:47.170 回答
0

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

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

在你的情况下 private Object result;

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

while deserializing the object JsonRpcResponse jsonResp = mapper.readValue(response, JsonRpcResponse.class);

in jsonResp you will have Object result, String className, here the object is of type linkedhashmap

Now to convert to your object

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

The above code will get you the generic object which you want .

Hope this helps

于 2015-11-17T06:16:56.127 回答