杰克逊在同一个POJO中映射不同的未包装元素

时间:2016-03-31 23:01:55

标签: java xml-parsing jackson

我正在尝试将一些XML解析为Java,但这个XML是一个很大的混乱。

所以看起来杰克逊只读取每种类型的最后一个对象,每种类型的数组大小只有一个对象。

编辑:这是我想要做的(调试并查看表单对象的值):

public class Main {

    public static void main(String[] args) throws IOException {
        XmlMapper mapper = new XmlMapper();
        Form form  = mapper.readValue(getXml(), Form.class);
    }

    public static String getXml() {

        return "<forms>\n"
            + "    <circles><x>1</x></circles>\n"
            + "    <squares><x>1</x></squares>\n"
            + "    <squares><x>1</x></squares>\n"
            + "    <circles><x>1</x></circles>\n"
            + "    <squares><x>1</x></squares>\n"
            + "</forms>";

    }

}

@JacksonXmlRootElement(localName = "forms")
class Form {

    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "circles", isAttribute = false)
    private List<Circle> circles;

    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "squares", isAttribute = false)
    private List<Square> squares;

    public List<Circle> getCircles() {
        return circles;
    }

    public void setCircles(List<Circle> circles) {
        this.circles = circles;
    }

    public List<Square> getSquares() {
        return squares;
    }

    public void setSquares(List<Square> squares) {
        this.squares = squares;
    }

}

@JacksonXmlRootElement(localName = "circles")
class Circle {

    @JacksonXmlProperty(isAttribute = false)
    private String x;

    public String getX() {
        return x;
    }

    public void setX(String x) {
        this.x = x;
    }

}

@JacksonXmlRootElement(localName = "squares")
class Square {

    @JacksonXmlProperty(isAttribute = false)
    private String x;

    public String getX() {
        return x;
    }

    public void setX(String x) {
        this.x = x;
    }

}

2 个答案:

答案 0 :(得分:1)

初始化列表。

    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "circles", isAttribute = false)
    private final List<Circle> circles = new ArrayList<>();

而不是替换,添加所有元素。

    public void setCircles(List<Circle> circles) {
        this.circles.addAll(circles);
    }

这是诀窍。感谢@StaxMan。

答案 1 :(得分:0)

由于列表是非连续的,所以会发生的是它们将被单独创建,以便最后一次运行覆盖更早。您可以通过实施setCircles(等)来附加到List而不是替换它来解决此问题。