我需要用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?
亲切的问候,
暴君
答案 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。:如果有人给我一个问题的解决方案(除了“不”),我很乐意将答案检查转移到他的答案!