首页 > 解决方案 > 使用 Jackson XML jar 将 XML 数据转换为 POJO?

问题描述

我正在使用来自另一个 Web 服务的 XML 数据处理 Java 项目。我是杰克逊框架的新手。创建 POJO 文件,但在映射时显示错误,如Unrecognized field 列。不知道如何映射我的回复

XML 响应

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CellSet>
    <Row key="MNg==">
        <Cell column="ZG9ybWFudF9kZXRhaW29u" timestamp="1563189660088">MjAQ==</Cell>
        <Cell column="ZG9yxzOkV5ZXBsdXM=" timestamp="1563189660088">RI0</Cell>
        <Cell column="ZG9ybWFudF9kZWxzOl=" timestamp="1563189660088"/>
        <Cell column="ZG9ybaWxzOlVDSUM=" timestamp="1563189660088">Mg==</Cell>
        <Cell column="ZG9ybWFudF9kZXRhYXRl" timestamp="1563189660088">MMQ==</Cell>
        <Cell column="ZG9ybWxzOlpveWE=" timestamp="1563189660088"/>
        <Cell column="ZzOndhdGNoZXM=" timestamp="1563189660088"/>
    </Row>
</CellSet>

单元集类

@JacksonXmlRootElement(localName = "CellSet")
public final class CellSet {

public CellSet() {}

@JacksonXmlElementWrapper(localName = "Row")
private Row[] rows;

public Row[] getRows() {
    return rows;
}

}

行类

public final class Row {

public Row() {}

@JacksonXmlElementWrapper(localName = "Cell")
private Cell[] cells;

public Cell[] getCells() {
    return cells;
}

}

细胞类

public final class Cell {

public Cell() {
    // TODO Auto-generated constructor stub
}

@JacksonXmlProperty(localName = "column", isAttribute = true)
private String column;

@JacksonXmlProperty(localName = "timestamp", isAttribute = true)
private String timestamp;

public String getColumn() {
    return column;
}

public String getTimestamp() {
    return timestamp;
}
}

帮我解决这个问题。

标签: javaxmljackson-dataformat-xml

解决方案


首先,查看 xml 文档和 Java bean 树,我假设一个响应在根Row元素下可以有多个元素。CellSet

因此,鉴于上述假设,您的对象模型存在几个问题。首先是滥用@JacksonXmlElementWrapper。此注释表示 XML 元素的数组由更高层次的元素包装。所以当你写

@JacksonXmlElementWrapper(localName = "Row")
private Row[] rows;

杰克逊期望这样的输入

<Row>  // xml wrapper
  <rows>  // xml array 
  <rows>
  <rows>
</Row>

事实上,你需要告诉杰克逊,行数组是这样展开的

@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "Row")
private Row[] rows;

和单元格数组相同。

另一个问题是Row该类没有键属性的目标, Cell也没有单元格元素的文本值的目标。
完整的解决方案如下

@JacksonXmlRootElement(localName = "CellSet")
public class CellSet {

    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "Row")
    public Row[] rows;
}

public class Row {

    @JacksonXmlProperty(localName = "key", isAttribute = true)
    public String key;

    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "Cell")
    public Cell[] cells;
}

public class Cell {

    @JacksonXmlText()
    public String value;

    @JacksonXmlProperty(localName = "column", isAttribute = true)
    public String column;

    @JacksonXmlProperty(localName = "timestamp", isAttribute = true)
    public String timestamp;

}

最后一点:在上述解决方案中,您的类也缺少 setter 方法(这是反序列化/解组,对吗?),为简洁起见,所有变量都公开


推荐阅读