Джексон - развернуть вложенные атрибуты

У меня есть такой 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 + '\'' +
                '}';
    }
}
Другие вопросы по тегам