Jackson Parser:忽略类型不匹配的反序列化

时间:2012-10-02 05:03:56

标签: java android json cakephp jackson

我收到了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名称的两个属性:一个数组和另一个对象,但这也没有用。

3 个答案:

答案 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