Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有多个包装器类的情况下反序列化XML?_Java_Xml_Jackson_Fasterxml - Fatal编程技术网

Java 如何在没有多个包装器类的情况下反序列化XML?

Java 如何在没有多个包装器类的情况下反序列化XML?,java,xml,jackson,fasterxml,Java,Xml,Jackson,Fasterxml,我有一些XML,我想使用Jackson FasterXML将其转换为对象。XML如下所示: <services> <service id="1" name="test"> <addresses> <postalAddress id="2" line1="123 Fake Street" city="Springfield" /> </addresses> </

我有一些XML,我想使用Jackson FasterXML将其转换为对象。XML如下所示:

<services>
    <service id="1" name="test">
        <addresses>
            <postalAddress id="2" line1="123 Fake Street" city="Springfield" />
        </addresses>
    </service>
</services>

这一切都很好,但拥有ServiceWrapper和AddressWrapper类需要大量开销和难看的代码;实际上,我只需要
节点和
节点中的数据。是否可以告诉Jackson对象直接填充我的服务类中的地址列表,而不使用AddressWrapper类来表示
节点?类似地,在不需要ServiceWrapper类的情况下直接获取整个xml并填充服务类?

避免编写/维护此类代码的正常方法是使用JAXB生成Java代码(带有适当的注释)。此过程使用XML模式(.xsd)作为输入,并使用可选的绑定文件(.xjb)自定义生成的代码

它看起来像许多JAXB注释


我还将注意到,JAXB代码生成器(xjc)支持插件,这些插件允许您执行几乎任何您想要增强生成代码的操作(例如,使用附加的方法或注释)。

避免编写/维护此类代码的正常方法是使用JAXB生成Java代码(带有适当的注释)。此过程使用XML模式(.xsd)作为输入,并使用可选的绑定文件(.xjb)自定义生成的代码

它看起来像许多JAXB注释

我还将注意到,JAXB代码生成器(xjc)支持插件,这些插件允许您执行几乎任何您想要增强生成代码的操作(例如,使用其他方法或注释)

JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "services")
public class ServiceWrapper {
    @JacksonXmlProperty(localName = "service")
    private Service service;
    //Getters and setters [...]
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Service {
    @JacksonXmlProperty(isAttribute = true)
    private int id;
    @JacksonXmlProperty(isAttribute = true)
    private String name;
    @JacksonXmlProperty(localName = "addresses")
    private AddressWrapper addresses;
    //Getters and setters [...]
}

public class AddressWrapper {
    @JacksonXmlProperty(localName = "postalAddress")
    private List<Address> addresses;
    //Getters and setters [...]
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Address {
    @JacksonXmlProperty(isAttribute = true, localName = "id")
    private int id;
    @JacksonXmlProperty(isAttribute = true, localName = "line1")
    private int address1;
    @JacksonXmlProperty(isAttribute = true, localName = "city")
    private int city;
    //Getters and setters [...]
}
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);

ObjectMapper mapper = new XmlMapper(module);
mapper.registerModule(new JSR310Module());
mapper.configure(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS, true);

ServiceWrapper serviceWrapper = mapper.readValue(xmlString, ServiceWrapper.class);
return serviceWrapper.getService();