java - Jackson xml反序列化 - 序列化为一个列表,其中包含任意元素
问题描述
我正在使用 Jackson 反序列化 XML。当中间没有其他元素时,它在序列化到列表中时工作正常,但是如果我在中间的某个地方插入一些其他字段,它似乎只会将字段下方的内容放入我的列表中。请参见下面仅包含 Product B 标记后的 ProductA 对象。
我使用xmlMapper readTree方法设置了一个断点来获取JsonNode对象,而ProductB标签上面的属性在节点树中是没有的。
有没有办法使用杰克逊(或其他库)来获取 Warehouse 元素中的所有 ProductA 元素,而与 Warehouse 子元素的顺序无关?
public class Warehouse {
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "ProductA")
private List<ProductA> productAList;
@JacksonXmlProperty(localName = "ProductB")
private String productB;
//getters and setters
}
public class ProductA {
@JacksonXmlProperty(localName = "PropA")
private String propA;
//getters and setters
}
<Warehouse>
<ProductA>
<propA>abc</propA>
</ProductA>
<ProductA>
<propA>abc</propA>
</ProductA>
<ProductB>def</ProductB>
<ProductA>
<propA>abc</propA>
</ProductA>
</Warehouse>
解决方案
更改您的 Warehouse 类以使用仅用于从 XML 设置 productAList 值的方法,并从 productAList 属性中删除注释。
@JsonSetter(value = "ProductA")
public void setProductAListFromXml(ProductA productA) {
if (this.productAList == null) {
this.productAList = new ArrayList<ProductA>();
}
this.productAList.add(productA);
}
这是完整的 Warehouse 类:
@JacksonXmlRootElement(localName = "Warehouse")
public class Warehouse {
private List<ProductA> productAList;
@JacksonXmlProperty(localName = "ProductB")
private String productB;
public List<ProductA> getProductAList() {
return productAList;
}
public void setProductAList(List<ProductA> productAList) {
this.productAList = productAList;
}
@JsonSetter(value = "ProductA")
public void setProductAListFromXml(ProductA productA) {
if (this.productAList == null) {
this.productAList = new ArrayList<ProductA>();
}
this.productAList.add(productA);
}
public String getProductB() {
return productB;
}
public List<ProductA> getProductA() {
return productAList;
}
}
使用这样的类:
String str = "<Warehouse>\r\n" +
" <ProductA>\r\n" +
" <propA>abc</propA>\r\n" +
" </ProductA>\r\n" +
" <ProductA>\r\n" +
" <propA>abc</propA>\r\n" +
" </ProductA>\r\n" +
" <ProductB>def</ProductB>\r\n" +
" <ProductA>\r\n" +
" <propA>abc</propA>\r\n" +
" </ProductA>\r\n" +
"</Warehouse>";
XmlMapper mapper = new XmlMapper();
Warehouse warehouse = mapper.readValue(str, Warehouse.class);
System.out.println(warehouse.getProductB());
System.out.println(warehouse.getProductA());
产生这个输出:
def
[ProductA [propA=abc], ProductA [propA=abc], ProductA [propA=abc]]
推荐阅读
- flutter - 从电话号码颤动中设置用户名
- c - 在 C 中正确散列字符串
- excel - 查找结果的 Excel 平均值
- list - 如何在 Flutter 中从 db 中获取这种类型的 List
- android - 未选择 edittext 时,onClick hideKeyboard 使该应用程序崩溃
- php - VSCode - PHP - 移动类后更新命名空间和其他文件的导入
- angular - 带有角度错误处理程序的回调不起作用 - 附上示例代码
- c - 我正在使用 posix_memalign 分配内存,但是当我尝试使用向量时,我得到分段失败
- spring-boot - 使用 spring boot 执行器配置所有日志级别
- user-defined-functions - 如何在 FaunaDB 中使用 UDF 循环输入数组?