当前位置: 首页 > 知识库问答 >
问题:

Java JAXB将元素编组到内部类中的对象

穆阳嘉
2023-03-14

我试图使用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>

我有以下几门课:

我的main类实际上会读取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("-----------------");
    }
}
@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执行以下操作。我可以创建一些额外的类或修改现有的类,但我不能更改我正在创建的传入JSONXML,因为它们是标准格式

>

  • 如何将地址城市状态从JSON映射到类对象。如果元素存在于address.class中,那么它可以自动映射,但是由于我想要xml中的extension标记,所以我已经将它们移动到了我的extension.class中,因此JAXB无法识别它,也无法将其映射到对象。

    如何将附加的extension标记添加到将在封送处理期间创建的XML。正如我们所看到的,JSON不包含extension标记,但我在XML中需要它。如果是它的集合,那么我可以使用@XmlElementWrapper,但在我的例子中,它不是集合

    我试着找了很多,但没有找到任何对我有帮助的东西。所以基于我的理解,我做了上面提到的事情。任何帮助或建议都将非常感谢。

  • 共有1个答案

    陆宏壮
    2023-03-14

    我认为您必须在JAXBContext中注册所有使用过的类

    JAXBContext context = JAXBContext.newInstance(Employee.class, Extension.class, ...)
    

    或者,您也可以传递所有类的“root”包:

    JAXBContext context = JAXBContext.newInstance("com.demo.beans")
    
     类似资料:
    • 我偶然发现了这个技巧,用于将值从匿名内部类获取到在外部类中声明的变量。它有效,但它感觉像一个肮脏的黑客: (是的,我意识到这个例子可以用一个简单的<code>JOptionPane,但我不能将<code>myValue

    • 我有一个python问题,我对这方面还不熟悉,想知道我缺少了什么。 我想做的事情是打印一个嵌套的元组,但从内到外。 例如:应打印为null,A,B,C 所有元组的最大大小为2。 我在考虑使用递归函数来实现这一点;我有这个密码,但我不知道怎么了。 我不是在问这个问题的答案(那太好了),但如果你能告诉我代码出了什么问题,我将不胜感激。 有人吗?有什么想法吗? 谢谢

    • 问题内容: 我有一个小整数列表,说: 我希望收集顺序对并返回一个包含从这些对创建的元组的新列表,即: 我知道必须有一种非常简单的方法来执行此操作,但不能完全解决。 谢谢 问题答案: 好吧,有一种非常简单但有些脆弱的方法,将其自身切片后再压缩。 如果您不知道,最后一个slice参数是“ step”。因此,我们从零(1、3、5)开始选择列表中的第二个项目。然后,我们执行相同的操作,但是从一个(2,4,

    • 我正在开发一个使用Expressjs、Mongodb和Mongoose的服务器。我需要将一个元素(字符串)推入“tweets”数组,该数组位于对象(朋友)内部,而对象(朋友)又位于“friends”数组内部,而“friends”数组位于“users”对象内部,该对象在“users”集合中记录。下面是Mongodb集合中的文档的示例: 我需要首先从“users”数组中选择指定的用户名,然后访问这个用

    • 问题内容: 我有一些孩子: 我想要以下布局: 无论文本中有多少文本,我都希望始终将其始终停留在底部,而不会将其从流程中移出。我听说这可以通过Flexbox实现,但我无法使其正常工作。 问题答案: 您可以使用自动边距 在通过和对齐之前,任何正的自由空间都会分配给该维度中的自动边距。 因此,您可以使用以下一种(或两种): 或者,您可以在增长之前使元素填充可用空间:

    • 下面我有以下数据。 所以,我不知道为什么UDF可以使用int而不能使用CharArray。此外,我觉得可能有一种方法可以做到这一点,而不使用UDF..但不确定从哪里开始。对这里可能发生的事情有什么建议吗?