Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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反序列化期间忽略json数组上的类型信息?_Java_Arrays_Json_Jackson - Fatal编程技术网

Java 如何在jackson反序列化期间忽略json数组上的类型信息?

Java 如何在jackson反序列化期间忽略json数组上的类型信息?,java,arrays,json,jackson,Java,Arrays,Json,Jackson,我想将ObjectMapper配置从包含类型信息的配置迁移到不包含类型信息的配置 目前,my ObjectMapper的配置如下: ObjectMapper objectMapper = new ObjectMapper().enableDefaultTypingAsProperty( ObjectMapper.DefaultTyping.NON_FINAL, "@class" ); 这使我能够反序列化如下所示的json对象: { "@class": "com.foo.BarCl

我想将ObjectMapper配置从包含类型信息的配置迁移到不包含类型信息的配置

目前,my ObjectMapper的配置如下:

ObjectMapper objectMapper = new ObjectMapper().enableDefaultTypingAsProperty(
  ObjectMapper.DefaultTyping.NON_FINAL, 
  "@class"
);
这使我能够反序列化如下所示的json对象:

{
  "@class": "com.foo.BarClass",
  "barProp": "bar"
  "barList": [
    [
      "java.util.ArrayList",
      [
        { "@class": "com.foo.BarListElement", ... },
        { "@class": "com.foo.BarListElement", ... },
        ...
      ]
  ],
  ...
}
使用以下POJO:

public class BarClass {
  private String barProp;
  // assume BarListElement to be a POJO with sensible getters/setters
  List<BarListElement> barList;
  // assume some other trivial fields and corresponding getters/setters
}
公共类BarClass{
私有字符串barProp;
//假设BarListElement是一个具有合理的getter/setter的POJO
列表栏列表;
//假设其他一些普通字段和相应的getter/setter
}
但是,我想删除对
enableDefaultTypingAsProperty
的调用,因为我的应用程序代码在反序列化过程中已经知道该类,因此它不必要地将反序列化代码绑定到完全限定的类名

我试图通过删除对ObjectMapper上的
enableDefaultTypingAsProperty
的调用并调用
配置(UNKNOWN属性上的反序列化feature.FAIL,false)
来实现这一点,目的是忽略json上存在的
“@class”
属性。不幸的是,这只适用于不包含数组的json,因为我收到的json数组包含具体的列表类型信息(即示例中数组中的
“java.util.ArrayList”
元素)


我想问一下,是否有任何方法可以配置
ObjectMapper
,从而忽略json数组上的集合类型。

您需要自定义集合反序列化程序,它将关注额外的类型信息。类型为的数组具有常规结构:
[“java.util.collectionType”,[…]
。要做到这一点,我们需要使用和定制。让我们从自定义反序列化程序开始:

class OmitListTypeJsonDeserializer extends CollectionDeserializer {

    public OmitListTypeJsonDeserializer(CollectionDeserializer src) {
        super(src);
    }

    @Override
    public Collection<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        p.nextToken(); // Omit array type
        p.nextToken(); // Omit comma and start array

        Collection<Object> collection = super.deserialize(p, ctxt);

        p.nextToken(); // Omit end of array

        return collection;
    }

    @Override
    public CollectionDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
        return new OmitListTypeJsonDeserializer(super.createContextual(ctxt, property));
    }
}
和反序列化对象:

BarClass{barProp='PROP1', barList=[BarListElement{sid=0.09525693290513237}, BarListElement{sid=0.689909415561781}], zet=123}

你能展示一下你的
POJO
模型和示例
JSON
,反序列化不起作用吗?@MichałZiober用POJO编辑了我的问题。示例json已经在讨论中了
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.deser.std.CollectionDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.type.CollectionType;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper typeAwareMapper = new ObjectMapper();
        typeAwareMapper.enable(SerializationFeature.INDENT_OUTPUT);
        typeAwareMapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL, "@class");

        String json = typeAwareMapper.writeValueAsString(new BarClass());
        System.out.println(json);

        SimpleModule module = new SimpleModule();
        module.setDeserializerModifier(new OmitListTypeDeserializerModifier());

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        System.out.println(mapper.readValue(json, BarClass.class));
    }
}

class BarClass {
    private String barProp = "PROP1";
    private List<BarListElement> barList = Arrays.asList(new BarListElement(), new BarListElement());
    private Integer zet = 123;

    // getters, setters
}

class BarListElement {

    private Double sid = Math.random();

    // getters, setters
}
{
  "@class" : "com.celoxity.BarClass",
  "barProp" : "PROP1",
  "barList" : [ "java.util.Arrays$ArrayList", [ {
    "@class" : "com.celoxity.BarListElement",
    "sid" : 0.09525693290513237
  }, {
    "@class" : "com.celoxity.BarListElement",
    "sid" : 0.689909415561781
  } ] ],
  "zet" : 123
}
BarClass{barProp='PROP1', barList=[BarListElement{sid=0.09525693290513237}, BarListElement{sid=0.689909415561781}], zet=123}