#java #xml #serialization #jackson
Вопрос:
У меня есть автоматически созданные POJOs, в которые я хочу десериализовать XML. XML выглядит следующим образом:
<RootElement>
<ListOfEntities>
<Entity>
<EntityRecord>
<Field>123</Field>
</EntityRecord>
</Entity>
</ListOfEntities>
<RootElement>
автоматически генерируемые объекты выглядят следующим образом:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "listOfEntitiesType", propOrder = {
"entity"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
public class ListOfEntitiesType {
@XmlElement(name = "Entity")
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
protected List<EntityType> entity;
.....
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entityType", propOrder = {
"entityRecord"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
public class EntityType {
@XmlElement(name = "EntityRecord")
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
protected List<EntityRecordType> entityRecord;
.....
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entityRecordType", propOrder = {
"field"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
public class EntityRecordType {
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
protected String field;
.....
}
и корневой элемент.
Я пытаюсь десериализовать его с помощью этого кода:
XmlMapper xmlMapper = XmlMapper.builder().enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES).build();
xmlMapper.readValue()
И я получаю ошибку:
Unrecognized field "field" (class path.to.autogenerated.classes.EntityType), not marked as ignorable (one known property: "entityRecord"])
Похоже, что когда Джексон пытается десериализовать ListOfEntities, он интерпретирует тег как своего рода оболочку элемента списка, поэтому он пытается интерпретировать его как элемент списка. И терпит неудачу
Я попытался написать такой код:
XmlMapper xmlMapper = XmlMapper.builder().defaultUseWrapper(false).enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES).build();
xmlMapper.readValue()
но безрезультатно.
У меня нет доступа ни к использованию аннотаций в POJOs (потому что они автоматически генерируются), ни к внесению изменений в xsd. Могу ли я как-то сказать xmlMapper, чтобы он правильно десериализовался?
Ответ №1:
Мне кажется, что вы упускаете @XmlAttribute
из виду следующее:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entityRecordType", propOrder = {
"field"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
public class EntityRecordType {
@XmlAttribute(name = "Field")
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
protected String field;
.....
}
Комментарии:
1. нет, в полях самого низкого класса есть только @Сгенерированная аннотация.
2. И этот класс автоматически генерируется, поэтому я не могу добавить никаких аннотаций
3. Как вы его автоматически генерируете?