Jackson xml 反序列化不连续的内联数组
Jackson xml deserializing inline array that is not contiguous
我有一些奇怪的东西 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" 的参数条目。
这是预期的行为吗?有没有我可以用来获取所有参数 Key/Value 对的注释?
谢谢!
这里的问题是 <StorageParameters Key="x" Value="***"/>
标签的存在:jackson 库期望在列表中反序列化只有 n <Parameter/>
等于标签,而是找到一个不同的标签,因此决定将列表解释为不同的属性,因此最后一个 <Parameter Key="d" Value="4"/>
覆盖了 Parameter
属性 的先前值,然后是奇怪的行为(另一个StorageParameters
被忽略导致 JsonIgnoreProperties(ignoreUnknown = true)
注释在 Operator
class).
为了避免这种行为,您可以删除不需要的 StorageParameters
并反序列化您的 xml 解析旧的 xml 并创建一个没有不需要的标签的新标签,如下所示:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new FileInputStream(xml));
Node node = doc.getElementsByTagName("StorageParameters").item(0);
node.getParentNode().removeChild(node);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
StringWriter writer = new StringWriter();
t.transform(new DOMSource(doc), new StreamResult(writer));
String result = writer.getBuffer().toString();
Operator value = mapper.readValue(result, Operator.class);
您必须在 Parameter
中使用 JacksonXmlProperty(isAttribute = true)
注释来指示值是属性:
@Data
public class Parameter {
@JacksonXmlProperty(isAttribute = true)
private String Key;
@JacksonXmlProperty(isAttribute = true)
private String Value;
}
@Data
public class Operator {
@JacksonXmlProperty(localName = "Parameter")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Parameter> parameters;
}
我有一些奇怪的东西 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" 的参数条目。
这是预期的行为吗?有没有我可以用来获取所有参数 Key/Value 对的注释?
谢谢!
这里的问题是 <StorageParameters Key="x" Value="***"/>
标签的存在:jackson 库期望在列表中反序列化只有 n <Parameter/>
等于标签,而是找到一个不同的标签,因此决定将列表解释为不同的属性,因此最后一个 <Parameter Key="d" Value="4"/>
覆盖了 Parameter
属性 的先前值,然后是奇怪的行为(另一个StorageParameters
被忽略导致 JsonIgnoreProperties(ignoreUnknown = true)
注释在 Operator
class).
为了避免这种行为,您可以删除不需要的 StorageParameters
并反序列化您的 xml 解析旧的 xml 并创建一个没有不需要的标签的新标签,如下所示:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new FileInputStream(xml));
Node node = doc.getElementsByTagName("StorageParameters").item(0);
node.getParentNode().removeChild(node);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
StringWriter writer = new StringWriter();
t.transform(new DOMSource(doc), new StreamResult(writer));
String result = writer.getBuffer().toString();
Operator value = mapper.readValue(result, Operator.class);
您必须在 Parameter
中使用 JacksonXmlProperty(isAttribute = true)
注释来指示值是属性:
@Data
public class Parameter {
@JacksonXmlProperty(isAttribute = true)
private String Key;
@JacksonXmlProperty(isAttribute = true)
private String Value;
}
@Data
public class Operator {
@JacksonXmlProperty(localName = "Parameter")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Parameter> parameters;
}