【问题标题】:Jackson Parser: ignore deserializing for type mismatchJackson Parser:忽略类型不匹配的反序列化
【发布时间】:2012-10-02 05:03:55
【问题描述】:

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

【问题讨论】:

    标签: java android json cakephp jackson


    【解决方案1】:

    因为,我不得不为许多对象处理这样的响应,所以我最终继续创建一个泛型类,该类将为特定的class 返回一个Deserializer

    这是我用的

    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】:

      如果类型不兼容,我认为将其分开是有意义的。

      另一种选择是使用常见的超类型,即java.lang.Object,您将获得List(用于JSON 数组)或Map(用于JSON 对象)。但需要进行后处理才能绑定到具体类型。

      【讨论】:

      • 感谢您的回答。我也会尝试这种方法。我通过为Event 对象创建自定义反序列化器找到了另一种解决方法。 this answer 帮助。
      • 是否将 DeserializationFeature.FAIL_ON_INVALID_SUBTYPE 用作 false 也适用于这种情况?
      • 只适用于多态类型;所以是的,如果声明的类型使用多态类型处理(通过@JsonTypeInfo,或默认类型)。我猜它在这里不会很好用。
      【解决方案3】:

      我发现这个问题最简单的解决方案是添加功能:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 2019-10-22
        • 2018-07-21
        相关资源
        最近更新 更多