【问题标题】:Jackson map different unwrapped elements in same POJOJackson 在同一个 POJO 中映射不同的展开元素
【发布时间】:2016-03-31 23:01:55
【问题描述】:

我正在尝试将一些 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;
    }

}

【问题讨论】:

  • 您需要包含更多信息:目前尚不清楚您在做什么和如何做,确切地说。所以一些显示用法的 Java 代码会很有帮助。但我同意所示代码是一团糟,将其映射到任何可用的东西可能并不容易。但是您可以尝试使用@JsonAnySetter,和/或在setter-methods 中对那些不相交的pointssquares 元素进行特殊处理。
  • 关于额外信息的任何想法?

标签: java xml-parsing jackson


【解决方案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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      相关资源
      最近更新 更多