杰克逊奇怪 XML 反序列化
Jackson strange XML Deserializing
我正在尝试使用 jackson xml 在 POJO 中反序列化那个奇怪的(格式错误?)xml :
<module id="1">
<field id="1">
<title>test</title>
<value>test value</value>
</field>
<field id="6">
<title>test2</title>
<value>first value</value>
<value checked="false">second value</value>
</field>
</module>
这是我目前使用的模型:
public class Field{
@JacksonXmlProperty(isAttribute = true)
private String id;
@JacksonXmlProperty(localName = "title")
private String title;
@JsonDeserialize(as=Value.class)
private Value value;
}
public class Value{
@JacksonXmlProperty(isAttribute = true)
private String checked;
@JacksonXmlText(value = true)
private String value;
}
到目前为止,我几乎可以阅读除 "value" 标签之外的所有内容。
如果只有一个 "value" 标签我可以得到它,但是一旦有多个 "value" 标签我只得到最后一个!我当然需要得到一切。
我还尝试放置一个值数组 class,但这似乎使 jackson 崩溃。
任何帮助将不胜感激^^
谢谢!
您的 class 字段有缺陷,它应该包含一个值列表而不是单个值,替换
private Value value;
和
private List<Value> values;
并且在您的 xml 中您有一个名为 <title>..</title>
的标签并且在 Field 中与 titre
不匹配
只是替换
@JacksonXmlProperty(localName = "titre")
和
@JacksonXmlProperty(localName = "title")
将值作为列表或数组并使用@JacksonXmlElementWrapper
注释。试试这个。
import java.io.File;
import java.util.List;
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;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
@JacksonXmlRootElement
class Module {
@JacksonXmlProperty(isAttribute = true)
private String id;
@JacksonXmlProperty(localName = "field")
@JacksonXmlElementWrapper(useWrapping=false)
List<Field> field;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<Field> getField() {
return field;
}
public void setField(List<Field> field) {
this.field = field;
}
@Override
public String toString() {
return "Module [id=" + id + ", " + field + "]";
}
}
class Field {
@JacksonXmlProperty(isAttribute = true)
private String id;
@JacksonXmlProperty(localName = "title")
private String title;
@JacksonXmlProperty(localName = "value")
@JacksonXmlElementWrapper(useWrapping=false)
private List<Value> value;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<Value> getValue() {
return value;
}
public void setValue(List<Value> value) {
this.value = value;
}
@Override
public String toString() {
return "Field [id=" + id + ", title=" + title + ", value=" + value
+ "]";
}
}
class Value{
@JacksonXmlProperty(isAttribute = true)
private String checked;
@JacksonXmlText(value = true)
private String value;
public String getChecked() {
return checked;
}
public void setChecked(String checked) {
this.checked = checked;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "Value [checked=" + checked + ", " + value + "]";
}
}
public class JacksonXmlParser {
public static void main(String[] args) throws Exception {
ObjectMapper xmlMapper = new XmlMapper();
Module obj = xmlMapper.readValue(new File("module.xml"), Module.class);
System.out.println(obj);
}
}
我正在尝试使用 jackson xml 在 POJO 中反序列化那个奇怪的(格式错误?)xml :
<module id="1">
<field id="1">
<title>test</title>
<value>test value</value>
</field>
<field id="6">
<title>test2</title>
<value>first value</value>
<value checked="false">second value</value>
</field>
</module>
这是我目前使用的模型:
public class Field{
@JacksonXmlProperty(isAttribute = true)
private String id;
@JacksonXmlProperty(localName = "title")
private String title;
@JsonDeserialize(as=Value.class)
private Value value;
}
public class Value{
@JacksonXmlProperty(isAttribute = true)
private String checked;
@JacksonXmlText(value = true)
private String value;
}
到目前为止,我几乎可以阅读除 "value" 标签之外的所有内容。 如果只有一个 "value" 标签我可以得到它,但是一旦有多个 "value" 标签我只得到最后一个!我当然需要得到一切。
我还尝试放置一个值数组 class,但这似乎使 jackson 崩溃。
任何帮助将不胜感激^^ 谢谢!
您的 class 字段有缺陷,它应该包含一个值列表而不是单个值,替换
private Value value;
和
private List<Value> values;
并且在您的 xml 中您有一个名为 <title>..</title>
的标签并且在 Field 中与 titre
只是替换
@JacksonXmlProperty(localName = "titre")
和
@JacksonXmlProperty(localName = "title")
将值作为列表或数组并使用@JacksonXmlElementWrapper
注释。试试这个。
import java.io.File;
import java.util.List;
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;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
@JacksonXmlRootElement
class Module {
@JacksonXmlProperty(isAttribute = true)
private String id;
@JacksonXmlProperty(localName = "field")
@JacksonXmlElementWrapper(useWrapping=false)
List<Field> field;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<Field> getField() {
return field;
}
public void setField(List<Field> field) {
this.field = field;
}
@Override
public String toString() {
return "Module [id=" + id + ", " + field + "]";
}
}
class Field {
@JacksonXmlProperty(isAttribute = true)
private String id;
@JacksonXmlProperty(localName = "title")
private String title;
@JacksonXmlProperty(localName = "value")
@JacksonXmlElementWrapper(useWrapping=false)
private List<Value> value;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<Value> getValue() {
return value;
}
public void setValue(List<Value> value) {
this.value = value;
}
@Override
public String toString() {
return "Field [id=" + id + ", title=" + title + ", value=" + value
+ "]";
}
}
class Value{
@JacksonXmlProperty(isAttribute = true)
private String checked;
@JacksonXmlText(value = true)
private String value;
public String getChecked() {
return checked;
}
public void setChecked(String checked) {
this.checked = checked;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "Value [checked=" + checked + ", " + value + "]";
}
}
public class JacksonXmlParser {
public static void main(String[] args) throws Exception {
ObjectMapper xmlMapper = new XmlMapper();
Module obj = xmlMapper.readValue(new File("module.xml"), Module.class);
System.out.println(obj);
}
}