【发布时间】:2020-03-26 05:21:42
【问题描述】:
我希望我的ParentClass 有final 字段,'brokenChildList' 列表是包装的 xml 元素,并且列表项的标记与列表 (<brokenChildList><brokenChild/></brokenChildList>) 不同。
这是重现我的问题的代码 sn-p(导入被部分截断,省略了 setter 和 getter)
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
public class Main {
public static void main(String... args) throws IOException {
ObjectMapper xmlMapper = new XmlMapper();
String xmlString = "<ParentClass><childClass name=\"name1\" value=\"val1\"/><brokenChildList><brokenChild name=\"bc1\" reason=\"bc-val1\"/><brokenChild name=\"bc2\" reason=\"bc-val2\"/></brokenChildList></ParentClass>";
ParentClass parentClass = xmlMapper.readValue(xmlString, ParentClass.class);
StringWriter stringWriter = new StringWriter();
xmlMapper.writeValue(stringWriter, parentClass);
String serialised = stringWriter.toString();
System.out.println(serialised);
System.out.println(xmlString.equals(serialised));
}
public static class ChildClass {
@JacksonXmlProperty(isAttribute = true)
private String name;
@JacksonXmlProperty(isAttribute = true)
private String value;
//getters & setters
}
public static class BrokenChild {
@JacksonXmlProperty(isAttribute = true)
private String name;
@JacksonXmlProperty(isAttribute = true)
private String reason;
//getters & setters
}
public static class ParentClass {
private final ChildClass childClass;
private final List<BrokenChild> brokenChildList;
@JsonCreator
public ParentClass(
@JsonProperty("childClass") ChildClass childClass,
@JsonProperty("brokenChildList") List<BrokenChild> brokenChildList
) {
this.childClass = childClass;
this.brokenChildList = brokenChildList;
}
@JacksonXmlProperty(localName = "childClass")
public ChildClass getChildClass() {
return childClass;
}
@JacksonXmlElementWrapper(localName = "brokenChildList")
@JacksonXmlProperty(localName = "brokenChild")
public List<BrokenChild> getBrokenChildList() {
return brokenChildList;
}
}
}
上面的代码给出了Jackson版本2.8.10的输出:
<ParentClass><childClass name="name1" value="val1"/><brokenChildList><brokenChild name="bc1" reason="bc-val1"/><brokenChild name="bc2" reason="bc-val2"/></brokenChildList></ParentClass>
true
使用Jackson 版本2.9.0 它给出:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Duplicate property 'brokenChildList' for [simple type, class org.test.Main$ParentClass]
at [Source: (StringReader); line: 1, column: 1]
我想找到一个解决方案(以及2.9.0 之后的任何版本),它可以提供与附加代码相同的输出。
我失败的尝试包括:
将
@JacksonXmlElementWrapper(localName = "brokenChildList")替换为@JacksonXmlElementWrapper会将包装器元素重命名为“brokenChild”,这是不可取的。删除
@JacksonXmlElementWrapper(localName = "brokenChildList")会将包装器元素重命名为“brokenChild”,这是不可取的。
【问题讨论】:
标签: java xml jackson xml-deserialization jackson-dataformat-xml