<a>
<b1>b1</b1>
<b2>b2</b2>
<b3>
<c1></c1>
<c2></c2>
</b3>
<b3>
<c1></c1>
<c2></c2>
</b3>
<b3>
<c1></c1>
<c2></c2>
</b3>
</a>
Run Code Online (Sandbox Code Playgroud)
由于所有这些<b3>都不包含在包装元素中,比如<b3s>当我使用Jackson XmlMapper将XML文件读取到我的POJO Java Bean类时,我得到了异常
com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.xxxxx] from String value; no single-String constructor/factory method (through reference chain: com.xxxx["xxx"]->com.xxx["xxx"])
Run Code Online (Sandbox Code Playgroud)
我应该使用什么注释?
@XmlElement
public List<B3> b3;
Run Code Online (Sandbox Code Playgroud)
如果你想使用"unwrapped"表示,你需要使用Jackson 2.1,并指出未解包的选项:
@JacksonXmlElementWrapper(useWrapping=false)
Run Code Online (Sandbox Code Playgroud)
或者,如果使用JAXB注释,则默认情况下不应使用包装.
最后,您还可以更改默认设置,不使用包装元素,使用:
JacksonXmlModule module = new JacksonXmlModule();
// to default to using "unwrapped" Lists:
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
Run Code Online (Sandbox Code Playgroud)
注意
Jackson不是符合JAXB(JSR-222)的实现.这意味着无法保证它如何解释标准的JAXB注释
默认情况下,符合JAXB(JSR-222)的实现不会将包装元素应用于集合属性.
一个
默认情况下,JAXB(JSR-222)实现将基于属性默认映射.为了节省空间,我省略了这些方法并进行了指定,@XmlAccessorType(XmlAccessType.FIELD)以便元数据将从实例变量(字段)派生.
package forum13097559;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
private String b1;
private String b2;
private List<B3> b3;
}
Run Code Online (Sandbox Code Playgroud)
B3
package forum13097559;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class B3 {
private String c1;
private String c2;
}
Run Code Online (Sandbox Code Playgroud)
演示
package forum13097559;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(A.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum13097559/input.xml");
A a = (A) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(a, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
input.xml中/输出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
<b1>b1</b1>
<b2>b2</b2>
<b3>
<c1></c1>
<c2></c2>
</b3>
<b3>
<c1></c1>
<c2></c2>
</b3>
<b3>
<c1></c1>
<c2></c2>
</b3>
</a>
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息
Jackson 不知道如何将字符串转换为 的实例B3。添加一个构造函数(或返回一个 的工厂方法B3) ,B3该构造函数接受单个String. 构造函数示例:
class B3 {
// ...
public B3(String value) {
// do something with value
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
http://wiki.fasterxml.com/JacksonFeatureCreators
| 归档时间: |
|
| 查看次数: |
7734 次 |
| 最近记录: |