簡體   English   中英

Jackson 在同一個 POJO 中映射不同的展開元素

[英]Jackson map different unwrapped elements in same POJO

我正在嘗試將一些 XML 解析為 Java,但是這個 XML 一團糟。

所以看起來 Jackson 只讀取了每種類型的最后一個對象,並且每種類型的數組大小只有一個對象。

編輯。:這就是我想要做的(調試並查看表單對象的值):

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;
    }

}

初始化列表。

    @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。

由於列表是不連續的,因此它們將被單獨創建,以便上次運行更早地覆蓋。 您可以通過實現setCircles (etc) 來附加到 List 而不是替換它來解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM