@XmlElementWrapper和@XmlElement在使用Jackson进行反序列化时无效

5

我正在使用jackson-databind:2.9.3和jackson-module-jaxb-annotations:2.9.3。

我有一个以下格式的JSON。

{
    "response": {
        "data": {
            "entry": {
                "name": "xxxxxxxxxx"
            }
        }
    }
}

这个JSON响应需要反序列化为具有以下结构的类。
@XmlRootElement(name = "response")
public class Response {

    private List<Entry> entry;

    public Response() {
    }

    public Response(List<Entry> entry) {
        this.entry = entry;
    }

    @XmlElementWrapper(name = "data")
    @XmlElement(name = "entry")
    public List<Entry> getData() {
        return this.entry;
    }

    public void setData(List<Entry> entry) {
        this.entry = entry;
    }
}

public class Entry {

    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

对于反序列化,我尝试了以下代码。但它没有起作用。

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.MapperFeature;
    import com.fasterxml.jackson.databind.AnnotationIntrospector;
    import com.fasterxml.jackson.databind.type.TypeFactory;
    import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
    import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
    mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);


    mapper.configure(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME, true);
    mapper.configure(MapperFeature.USE_ANNOTATIONS, true);

    AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
    AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
    mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));

    System.out.println(mapper.readValue(s, Response.class));

但是遇到了以下异常

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "entry" (class Entry), not marked as ignorable

at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:60)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:822)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1152)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1567)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1545)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:293)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:352)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:264)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:287)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectMapper._unwrapAndDeserialize(ObjectMapper.java:4081)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3999)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992)

......

我不确定我错过了什么。任何帮助都将不胜感激。提前致谢。


你不应该使用XmlMapper吗? - mojo2012
你找到解决这个问题的方法了吗?我也遇到了同样的问题。 - user3187479
2个回答

3
尝试添加以下内容:
mapper.registerModule(new JaxbAnnotationModule());

0

我在升级到 com.fasterxml.jackson 版本 2.13.3 后遇到了同样的问题。

为了解决这个问题,我将我的注释迁移到了:

@XmlElement(name = "status")
@XmlElementWrapper(name = "statuses")
private List<Status> statuses;

到:

@JacksonXmlProperty(namespace = NS, localName = "status")
@JacksonXmlElementWrapper(localName = "statuses")
private List<Status> statuses;

*** 并且 通过添加JacksonXmlAnnotationIntrospector,改变了XmlMapper的配置。

所以从:

mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
mapper.registerModule(JavaTimeModule())
mapper.registerModule(Jdk8Module())
mapper.registerModule(JaxbAnnotationModule())
mapper.configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.setVisibility(mapper.serializationConfig.defaultVisibilityChecker
  .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
  .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
  .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
  .withCreatorVisibility(JsonAutoDetect.Visibility.NONE))

到:

mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
mapper.registerModule(JavaTimeModule())
mapper.registerModule(Jdk8Module())
mapper.registerModule(JaxbAnnotationModule())

mapper.setAnnotationIntrospector(JacksonXmlAnnotationIntrospector())

mapper.configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.setVisibility(mapper.serializationConfig.defaultVisibilityChecker
  .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
  .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
  .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
  .withCreatorVisibility(JsonAutoDetect.Visibility.NONE))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接