我正在尝试用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我希望它反序列化的类。但这不起作用。
我整天用不同的方式捣乱了我的头脑,但我可能不明白杰克逊的工作原理。
任何人都可以帮我吗?
提前谢谢。
答案 0 :(得分:1)
在github上查看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))
上面的代码将为您提供所需的通用对象。
希望这有帮助