[英]Convert XML data to POJO with Jackson XML jar?
我正在使用来自另一个Web服务的XML数据处理Java项目。 是Jackson框架的新手。 创建POJO文件,但在映射时显示错误,如无法识别的字段列。 不知道如何绘制我的回应
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>
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树,我假设一个响应在CellSet
根元素下可以有多个Row
元素。
因此,基于上述假设,对象模型存在几个问题。 第一个是@JacksonXmlElementWrapper
的滥用。 此注释表示XML元素数组由higer-hierarchy元素包装。 所以当你写
@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方法(这是反序列化/解组,对吗?),所有变量都为了简洁起见公开
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.