java - 使用 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;
}
}
帮我解决这个问题。
解决方案
首先,查看 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 方法(这是反序列化/解组,对吗?),为简洁起见,所有变量都公开
推荐阅读
- regex - 正则表达式匹配给定格式的字符串之外的任何字符
- strapi - Strapi:如何禁用注册?
- javascript - Cannot set property 'x' of undefined
- three.js - Stretching towards a vector
- jasmine - 量角器/Jasmine 错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内未调用异步回调
- android - 使用 CameraX 分析时如何选择图像的一部分
- android - Custom notification is not shown when using `startForeground` on Android O
- java - 如何删除不同活动中的重复代码?
- python - 如何在 Python 的同一行中输入多个数字类型
- react-native - 没有4G可以用热点制作多人游戏吗?