[英]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:
我理解原始问题是关于“结果”对象的多态反序列化。
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.