【发布时间】:2021-07-20 12:49:35
【问题描述】:
我尝试使用 JAXB 注释将 JSON 数据转换为 XML。我的JSON 有点像这样:
{
"Employee": {
"name": "Tanmay",
"Email": "tanmaypatil@xyz.com",
"Address": {
"City": "Florida",
"State": "Miami"
}
}
}
我想使用编组来创建如下所示的 XML:
(请注意extension 标签在JSON 中不存在,但我需要在XML 中添加)
<Company>
<Employee>
<FirstName>Tanmay</FirstName>
<extension>
<Address>
<City>Florida</City>
<State>Miami</State>
</Address>
</extension>
</Employee>
</Company>
我有以下课程:
我的主类实际上会读取 JSON 数据并将其编组为 XML。为了简单起见,我使用 Jackson 来读取 JSON 数据,我删除了该代码:
public class Main
{
public static void main(String[] args) {
JsonFactory jsonFactory = new JsonFactory();
JsonParser jsonParser = jsonFactory.createParser(new File(Main.class.getClassLoader().getResource("InputEPCISEvents.json").toURI()));
//I am using the JAKSON jsonParser to read the JSON file and automatically map it to the child classes
//Ommiting the JACKSON JsonParser code for simplicity purpose
JAXBContext context = JAXBContext.newInstance(Employee.class);
Marshaller mar = context.createMarshaller();
mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
mar.marshal(eventInfo, System.out);
System.out.println("-----------------");
}
}
以下是我的父类,它将映射到传入的 JSON:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlTransient
public class Employee{
private String name;
private String email;
private Address address;
//getters and setters are ommited
//Noargs and allargs constuctor ommited
}
以下是我的Address 班级:
@XmlRootElement(name = "Employee")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Extension", propOrder = { "name","email","city","state"})
private class Address extends Employee{
@XmlElement(name = "extension")
private Extension extension;
public Extension getExtension() {
extension.setCity(getCity());
extension.setState(getState());
return extension;
}
public Extension setExtension(Extension extension) {
this.setCity(extension.getCity());
this.setState(extension.getState());
this.extension = extension;
}
}
以下是我创建为Extension 标记的Extension 类不会出现在传入的JSON 中,但我需要在编组期间将其添加到XML:
@XmlAccessorType(XmlAccessType.FIELD)
public class Extension{
private String city;
private String state;
//getters and setters are ommited
//Noargs and allargs constuctor ommited
}
我想知道如何使用JAXB 执行以下操作。我可以创建一些额外的类或修改现有的类,但我无法更改传入的 JSON 或 XML,因为它们是标准格式。
-
如何将
address,city,state从 JSON 映射到 Class 对象。如果元素存在于Address.class中,那么它可以自动映射,但由于我想要XML中的extension标记,我已将它们移动到我的Extension.class,因此JAXB无法识别它并且它没有映射到对象。 -
如何将额外的
extension标记添加到将在编组期间创建的XML。我们可以看到JSON不包含extension标签,但我需要它在XML中。如果它的集合,那么我可以使用@XmlElementWrapper,但在我的情况下它不是集合。
我尝试了很多搜索,但找不到任何对我有帮助的东西。所以根据我的理解,我已经做了上面提到的事情。任何帮助或建议将不胜感激。
【问题讨论】:
标签: java xml jaxb marshalling maven-jaxb2-plugin