Джексон - развернуть вложенные атрибуты
У меня есть такой xml
<TopLevel attr1="foo">
<Midlevel attr2="bar">
<BottomLevel>
<data1>blahblah</data1>
<data2>blahblah</data2>
</BottomLevel>
...more bottom level elements...
</Midlevel>
...moreMidLevelElements...
</TopLevel>
Теперь я знаю, что аннотация @JsonUnwrapped может помочь с одним уровнем (который он показывает во всех примерах). Но когда я пытаюсь десериализовать объект BottomLevel, который фиксирует атрибуты внешних слоев, я просто получаю нулевые значения для всего.
Может кто-нибудь помочь мне сгладить этот XML? Я пытался обобщить вопрос. В идеале конечным результатом будет список
У моего pojo есть поля data1 data2 attr1 attr2
1 ответ
Не думайте, что это идеальный ответ на этот вопрос, но он может помочь решить проблему, с которой вы столкнулись. (Хакерским способом)
public static void main(String[] args) throws IOException {
String xml = "<TopLevel attr1=\"foo\">\n" +
" <Midlevel attr2=\"bar\">\n" +
" <BottomLevel>\n" +
" <data1>blahblah</data1>\n" +
" <data2>blahblah</data2>\n" +
" </BottomLevel>\n" +
" </Midlevel>\n" +
" <Midlevel attr2=\"bar2\">\n" +
" <BottomLevel>\n" +
" <data1>blahblah2</data1>\n" +
" <data2>blahblah2</data2>\n" +
" </BottomLevel>\n" +
" </Midlevel>\n" +
"</TopLevel>";
ObjectMapper xmlMapper = new XmlMapper();
System.out.println(xmlMapper.readValue(xml, TopLevel.class)); //Once here, you can now do custom mapping with the TopLevel class object to your custom POJO
}
@JsonIgnoreProperties(ignoreUnknown = true)
static class TopLevel {
@JacksonXmlProperty(isAttribute = true)
private String attr1;
@JacksonXmlElementWrapper(localName = "Midlevel", useWrapping = false)
@JacksonXmlProperty(localName = "Midlevel")
private List<MidLevel> midLevel = new ArrayList<>();
@Override
public String toString() {
return "TopLevel{" +
"attr1='" + attr1 + '\'' +
", midLevel=" + midLevel +
'}';
}
}
static class MidLevel {
@JacksonXmlProperty(isAttribute = true)
private String attr2;
@JacksonXmlElementWrapper(localName = "BottomLevel", useWrapping = false)
@JacksonXmlProperty(localName = "BottomLevel")
private List<BottomLevel> bottomLevels = new ArrayList<>();
@Override
public String toString() {
return "MidLevel{" +
"attr2='" + attr2 + '\'' +
", bottomLevels=" + bottomLevels +
'}';
}
}
static class BottomLevel {
@JacksonXmlProperty(localName = "data1")
private String data1;
@JacksonXmlProperty(localName = "data2")
private String data2;
@Override
public String toString() {
return "BottomLevel{" +
"data1='" + data1 + '\'' +
", data2='" + data2 + '\'' +
'}';
}
}