7
<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>

由于所有这些<b3>都不包含在包装器元素中,比如说<b3s>当我使用 JacksonXmlMapper将 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"])

我应该使用什么注释?

@XmlElement
public List<B3> b3;
4

3 回答 3

6

如果你想使用“unwrapped”表示,你需要使用 Jackson 2.1,并指明 unwrapped 选项:

@JacksonXmlElementWrapper(useWrapping=false)

或者,如果使用 JAXB 注释,则默认不应使用包装。

最后,您还可以更改默认不使用包装器元素,方法是:

JacksonXmlModule module = new JacksonXmlModule();
// to default to using "unwrapped" Lists:
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
于 2012-10-28T06:45:06.430 回答
5

笔记

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;

}

B3

package forum13097559;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class B3 {

    private String c1;
    private String c2;

}

演示

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);
    }

}

输入.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>

了解更多信息

于 2012-10-29T14:37:25.147 回答
0

Jackson 不知道如何将字符串转换为B3. 添加一个构造函数(或返回 a 的工厂方法B3),B3它接受一个String. 构造函数示例:

class B3 {
    // ...
    public B3(String value) {
       // do something with value 
    }
    // ...
}

http://wiki.fasterxml.com/JacksonFeatureCreators

于 2012-10-27T05:52:02.447 回答