gpt4 book ai didi

java - 使用 Jackson XML jar 将 XML 数据转换为 POJO?

转载 作者:行者123 更新时间:2023-12-02 02:23:34 24 4
gpt4 key购买 nike

我正在使用来自另一个 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 元素数组由较高层次结构元素包装。所以当你写

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

jackson 期望这样的输入

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

事实上,您需要告诉 Jackson 行数组是展开的,如下所示

@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方法(这是反序列化/解码,对吧?)在上面的解决方案中,为了简洁起见,所有变量都公开了

关于java - 使用 Jackson XML jar 将 XML 数据转换为 POJO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57266511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com