我正在尝试将一些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;
}
}
答案 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而不是替换它来解决此问题。