我有一些奇怪的xml我试图将其转换为java对象
<Operator>
<Parameter Key="a" Value="1"/>
<Parameter Key="b" Value="2"/>
<Parameter Key="c" Value="3"/>
<StorageParameters Key="x" Value="***"/>
<Parameter Key="d" Value="4"/>
</Operator>
我只需要将参数节点收集为列表。我编写的java类如下
@JsonIgnoreProperties(ignoreUnknown = true)
public class Operator {
@JacksonXmlProperty(localName="Parameter")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Parameter> parameters;
public Operator() {
this.parameters = List.of();
}
public List<Parameter> getParameters() {
return parameters;
}
public void setParameters(List<Parameter> parameters) {
this.parameters = parameters;
}
}
public class Parameter {
private String Key;
private String Value;
public Parameter() {
Key = "";
Value = " ";
}
public String getKey() {
return Key;
}
public void setKey(String key) {
Key = key;
}
public String getValue() { return Value; }
public void setValue(String value) {
Value = value;
}
}
// Driver
JacksonXmlModule module = new JacksonXmlModule();
XmlMapper mapper = new XmlMapper(module);
Operator bean = mapper.readValue(xmlText, classOf[Operator])
当我运行这个时,参数列表返回的唯一值是Key=“d”和Value=“4”的最后一个参数条目。
这是预期的行为吗?是否有任何注解可以用来获取所有参数键/值对?
谢谢你,谢谢
2条答案
按热度按时间35g0bw711#
这里的问题是
<StorageParameters Key="x" Value="***"/>
标记的存在:Jackson库期望在列表中仅对 n<Parameter/>
相等标签的存在进行分类,但却发现不同的标签并因此决定将该列表解释为不同的属性,所以最后一个<Parameter Key="d" Value="4"/>
覆盖了Parameter
属性的前一个值,(另一个StorageParameters
被忽略,因为Operator
类中有JsonIgnoreProperties(ignoreUnknown = true)
注解)。为了避免这种行为,你可以删除不需要的
StorageParameters
,并解析旧的xml,然后创建一个没有不需要的标签的新xml,如下所示:您必须在
Parameter
中使用JacksonXmlProperty(isAttribute = true)
注解来指示值是属性:2w3kk1z52#
你可以像这里一样使用
@JsonMerge
:How to deserealize multiple nested elements in Jackson?在您的案例中: