gpt4 book ai didi

java - Jackson xml 反序列化 - 序列化为一个列表,其中包含任意元素

转载 作者:行者123 更新时间:2023-12-01 14:31:45 25 4
gpt4 key购买 nike

我正在使用 Jackson 反序列化 XML。当中间没有其他元素时序列化到列表中时它工作正常,但是如果我在中间某处插入一些其他字段,它似乎只将字段下方的内容放入我的列表中。下面仅查看包含 Product B 标签后的 ProductA 对象。
我设置了一个断点来使用xmlMapper readTree 方法获取JsonNode 对象,并且ProductB 标记上方的属性不在节点树中。
有没有办法使用 jackson(或其他库)来获取 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]]

关于java - Jackson xml 反序列化 - 序列化为一个列表,其中包含任意元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63081883/

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