有没有条件杰克逊杰森战略?

时间:2011-04-13 09:37:07

标签: java conditional jackson deserialization geojson

我需要用Jackson库反序列化GeoJSON JSON object。在这个json对象中有适用的地方:
如果有

"type" : "name"  

比以下json对象属于一种类型。可以说,例如:

"properties": {
   "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}  

另一方面,如果有

"type": "link"  

比以下json对象属于另一种类型。可以说,例如:

"properties": {  
   "href": "http://example.com/crs/42",  
   "type": "proj4"  
}  

现在我有一个包含以下内容的PropertiesPOJO:

private String name;  
private String href;
private String type;

当前的解决方案需要检查对象的类型,以便我们知道要考虑的PropertiesPOJO的哪些部分。这不是一个好习惯。我宁愿使用自定义反序列化器来执行此操作,该序列化器将直接反序列化为NamePropertiesPOJO或LinkPropertiesPOJO。我有一个想法是放置

@JsonDeserialize(using=PropertiesDeserializer.class)
@JsonProperty("properties")
NamePropertiesPOJO namePropertiesPOJO = null;

@JsonDeserialize(using=PropertiesDeserializer.class)
@JsonProperty("properties")
LinkPropertiesPOJO linkPropertiesPOJO = null;

但我得到了

  

JsonMappingException发生:多个   代表财产的字段   “属性”:

那么,有没有其他方法可以使用杰克逊的注释做更多的OO?

亲切的问候,
暴君

3 个答案:

答案 0 :(得分:2)

这被称为“外部类型id”,虽然Jackson尚不支持它(与嵌入在Object中的类型标识符不同;在这种情况下,作为一个附加属性),它应该是支持应该根据{{​​3}}将来添加。它不会在1.8中出现,但希望之后的版本。 GeoJSON是一个常见的用例 - 我希望他们选择了更常见的机制,但由于格式的普及,这是一个需要支持的高优先级。

答案 1 :(得分:0)

你应该能够通过

来做到这一点
class Pojo {
    Map<String,String> properties;
    ...
}

然后只是从地图上读取内容。

另外,当你刚拿到没有注释的POJO时,杰克逊也应该 能够自己填写正确的变量。在setter中你可以设置一个标志,它是类型1或类型2,这样你就可以if (pojo.isType1())

答案 2 :(得分:0)

我想简单的答案就是,没有条件反序列化杰克森json策略。

干杯,
暴君
P.S。:如果有人给我一个问题的解决方案(除了“不”),我很乐意将答案检查转移到他的答案!