[英]@XmlElementWrapper and@XmlElement not working on de-serialization using Jackson
我正在使用 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)
......
不知道我錯過了什么。 任何幫助,將不勝感激。 提前致謝。
嘗試添加此:
mapper.registerModule(new JaxbAnnotationModule());
升級到 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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.