Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson解析器:忽略类型不匹配的反序列化_Java_Android_Json_Cakephp_Jackson - Fatal编程技术网

Java Jackson解析器:忽略类型不匹配的反序列化

Java Jackson解析器:忽略类型不匹配的反序列化,java,android,json,cakephp,jackson,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": "Asda

我从服务器上通过
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"
  }
 },
 .......
 ]
问题是解析器需要
事件
对象,但如果它的
为null
则接收空数组

由于响应是由
cakephp
自动生成的,因此必须在服务器端的许多地方对其进行更改

如果属性是空数组,jackson有没有简单的方法可以忽略它

编辑:


我尝试过用
事件
名称拥有两个属性:一个数组和另一个对象,但这也不起作用。

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


另一个选项是使用公共超类型,这意味着
java.lang.Object
,您将获得
List
(对于JSON数组)或
Map
(对于JSON对象)。但是需要进行后处理才能绑定到具体类型。

因为,我必须对许多对象处理这样的响应,所以我最终创建了一个泛型类,该类将为特定的
类返回一个
反序列化器

这是我用过的

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;
         }
     };
}
公共类反序列化器{
公共JsonDeserializer getDeserializer(最终类cls){
返回新的JsonDeserializer(){
@凌驾
公共T反序列化(JsonParser jp,反序列化上下文arg1)抛出IOException,JsonProcessingException{
JsonNode=jp.readValueAsTree();
if(node.isObject()){
返回新的ObjectMapper().convertValue(节点,cls);
}
返回null;
}
};
}

}

我发现解决此问题最简单的方法是添加以下功能:

DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true
到我的objectmapper。杰克逊为你做其余的事。看


这个答案给出了一个深入的解释:

谢谢你的回答。我也会尝试这个方法。通过为
事件
对象创建自定义反序列化程序,我找到了另一种解决方法。helped.feature.FAIL_对_INVALID_子类型使用false是否也适用于这种情况?这仅适用于多态类型;因此,如果声明的类型使用多态类型处理(通过
@JsonTypeInfo
或默认类型),那么是的。我猜它在这里不太管用。