Java 如何在没有多个包装器类的情况下反序列化XML?
我有一些XML,我想使用Jackson FasterXML将其转换为对象。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> </
<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();