Java 是否有任何条件jackson json策略?
我需要反序列化一个与Jackson库的链接。在这个json对象中,有一些地方是适用的:Java 是否有任何条件jackson json策略?,java,conditional,jackson,deserialization,geojson,Java,Conditional,Jackson,Deserialization,Geojson,我需要反序列化一个与Jackson库的链接。在这个json对象中,有一些地方是适用的: 如果有 "type" : "name" "type": "link" 而下面的json对象是一种类型。比如说: "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } "properties": { "href": "http://example.com/crs/42", "type": "proj4"
如果有
"type" : "name"
"type": "link"
而下面的json对象是一种类型。比如说:
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
"properties": {
"href": "http://example.com/crs/42",
"type": "proj4"
}
另一方面,如果有
"type" : "name"
"type": "link"
而下面的json对象是另一种类型。比如说:
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
"properties": {
"href": "http://example.com/crs/42",
"type": "proj4"
}
现在我有一个PropertiesPOJO,它包含:
private String name;
private String href;
private String type;
<强>当前的解决方案需要检查对象的类型,这样我们就知道我们想考虑的属性Pojo的哪些部分。< /强>这不是一个好的实践。我宁愿使用自定义反序列化程序来实现这一点,它将直接反序列化到NamePropertiesPOJO或LinkPropertiesPOJO。我的一个想法是
@JsonDeserialize(using=PropertiesDeserializer.class)
@JsonProperty("properties")
NamePropertiesPOJO namePropertiesPOJO = null;
@JsonDeserialize(using=PropertiesDeserializer.class)
@JsonProperty("properties")
LinkPropertiesPOJO linkPropertiesPOJO = null;
但是我有一个
发生JsonMappingException:多个
表示属性的字段
“财产”:
那么,有没有其他方法可以使用jackson的注释来实现更多的OO呢?
亲切的问候,暴君你应该可以通过
class Pojo {
Map<String,String> properties;
...
}
类Pojo{
地图属性;
...
}
然后从地图上读一下
另外,当你刚刚有了没有注释的POJO时,Jackson也应该
能够自己填写正确的变量。在setters中,您可以设置一个标志,这是类型1或类型2,因此您可以执行
if(pojo.isType1())
我想简单的答案是,没有条件反序列化策略
干杯,暴君
附言:如果有人给我一个问题的解决方案(不是“否”),我会很乐意将答案检查转移到他的答案上 这被称为“外部类型id”,虽然Jackson还不支持它(不同于嵌入到对象中的类型标识符;在本例中,它是一个附加属性),但它是将来应该添加支持的东西,如所示。它不会在1.8版本中实现,但希望在1.8之后的版本中实现。
GeoJSON是一个经常出现的用例——我希望他们选择了更常见的机制,但由于格式的流行,这是一个需要优先支持的问题。您在这里展示的第一部分是由@JsonAnySetter实现的,它甚至比我的设计更糟糕-它将使用所有可用的json参数填充properties变量。。。您提出的第二种方法不好,因为它会干扰POJO定义。POJO应该只有简单的setter和getter。此外,我真的不需要这个,因为我可以做一个if(type.equals(“name”)或if(type.equals(“link”),并具有相同的功能。诀窍是让jackson反序列化器为我们做这件事!很好的尝试。干杯!感谢StaxMan提供的信息!很高兴知道。我还可以看到jackson的另一个缺点(虽然它是一个非常好的库)。当您提供List.class时,它无法理解如何解析JSON对象。我知道这不是jackson要预见的工作,但这是一个真实的场景(我期待一个JSON数组),但有时当请求不正确或我们请求的服务器没有响应时,我们会得到一个JSON对象而不是JSON数组。因此,我必须重写受保护的对象readInternal(类clazz,HttpInputMessage inputMessage)以检查'{.off-topic但很高兴知道hmmh。我不确定我是否理解这个问题…如果您想指定数组的内容(需要类型参数),可以使用TypeReference(比如,new TypeReference(){})来完成。也许您可以在jackson用户列表中解释这个问题?