我收到了cakephp
[
{
"id": "42389",
"start": "0000-00-00",
"end": "0000-00-00",
"event_id": null,
"trip_id": "5791",
"location_id": "231552",
"user_id": "105",
"users_attending": "0",
"user_local": "0",
"Trip": {
"name": "Asdas"
},
"Event": [],
"Location": {
"name": "South Melbourne"
}
},
{
"id": "42392",
"start": "0000-00-00",
"end": "0000-00-00",
"event_id": "1218",
"trip_id": "4772",
"location_id": "271505",
"user_id": "105",
"users_attending": "3",
"user_local": "50",
"Trip": {
"name": "trip by 1059200"
},
"Event": {
"title": "SampleEvent 454",
"id": "1218"
},
"Location": {
"name": "Houston"
}
},
.......
]
问题在于解析器需要Event
个对象,但如果它是null
,则它接收空数组。
由于响应是由cakephp
自动生成的,因此必须在服务器端的很多地方进行更改。
杰克逊是否有任何简单的方法可以忽略Event
属性,如果它是一个空数组?
编辑:
我尝试过使用Event
名称的两个属性:一个数组和另一个对象,但这也没有用。
答案 0 :(得分:1)
如果类型不兼容,我认为分离它是有意义的。
另一种选择是使用常见的超类型,这意味着java.lang.Object
,你会得到List
(对于JSON数组)或Map
(对于JSON)宾语)。但是需要进行后处理以绑定到具体类型。
答案 1 :(得分:1)
因为我必须为许多对象处理这样的响应,所以我最终继续创建了一个泛型类,它将为特定的Deserializer
返回class
。
这是我使用的
public class Deserializer<T> {
public JsonDeserializer<T> getDeserializer(final Class<T> cls) {
return new JsonDeserializer<T> (){
@Override
public T deserialize(JsonParser jp, DeserializationContext arg1) throws IOException, JsonProcessingException {
JsonNode node = jp.readValueAsTree();
if (node.isObject()) {
return new ObjectMapper().convertValue(node, cls);
}
return null;
}
};
}
}
答案 2 :(得分:0)
我发现此问题最简单的解决方案是添加功能:
DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true
到我的对象映射器。杰克逊为您完成其余的工作。参见https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/DeserializationFeature.html。
此答案进行了深入的解释:https://stackoverflow.com/a/22956168/9279756