3

我需要使用 Jackson 库反序列化GeoJSON JSON 对象。在这个 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 发生:表示属性“属性”的多个字段:

那么,有没有其他方法可以使用杰克逊的注释来做更多的面向对象?

亲切的问候,
暴君

4

3 回答 3

2

这被称为“外部类型 ID”,虽然 Jackson 尚不支持它(与嵌入在 Object 中的类型标识符不同;在这种情况下,作为一个附加属性),它是应该添加支持的东西未来,根据JACKSON-453。它不会在 1.8 中实现,但希望之后的版本。GeoJSON 是一个经常出现的用例——我希望他们选择更通用的机制,但由于格式的流行,这是一个需要支持的高优先级的东西。

于 2011-04-14T16:57:22.667 回答
0

你应该可以通过

class Pojo {
    Map<String,String> properties;
    ...
}

然后从地图上读取内容。

此外,当您只显示没有注释的 POJO 时,Jackson 也应该能够自行填写正确的变量。在设置器中,您可以设置一个标志,它是类型 1 或类型 2,因此您可以这样做if (pojo.isType1())

于 2011-04-13T13:20:14.903 回答
0

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

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

于 2011-04-14T09:21:12.610 回答