Java 是否有任何条件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"

我需要反序列化一个与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"  
}  
现在我有一个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用户列表中解释这个问题?