微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在另一个 JAXB 编组对象中创建 JAXB 编组对象

如何解决如何在另一个 JAXB 编组对象中创建 JAXB 编组对象

我有一个奇怪的要求,我在网上找不到任何与此相关的参考资料,因此在此处发布以供指导。

我正在使用 Moxy JAXB 将我的 JSON 输入数据编组到 XML 中。一切正常,直到新的需求出现。

我正在使用 JSON 读取我的 Jackson 输入,而我的 XML 没有预定义的元素作为其 UserExtension,这些元素完全由用户根据他们的需要给出,所以我我使用 @JsonGetter and @JsonSetter 将信息存储在 Map<String,Object> 中,然后我使用 @XmlJavaTypeAdapter 创建 JAXBElement 并使用 marshalling 到 XML。

请注意,我已经用最简单的例子来解释这个问题。但是,我的实际 Extension 类有许多专用字段。除此之外,我还有这些用户定义的字段。最后,我解释了为什么我不能使用您认为可以解决此问题的直接方法

以下是我的 Extension.class,它将在读取 JSON 文件时使用。此外,这是使用 JAXBMarshalling 用于 @XmlJavaTypeAdapter 的类。

@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlRootElement(name = "Extension")
@XmlType(name = "Extension",propOrder = {"userExtensions"})
public class Extension{

    private Date time;
    private String step;
    //Similarly many other fields and at the end user-defined fields.
    
    @JsonIgnore
    @XmlJavaTypeAdapter(TestAdapter.class)
    private Map<String,Object> userExtensions;
    
    public Map<String,Object> getUserExtensions() {
        return userExtensions;
    }

    //Added the method to capture the User extensions directly using the Jackson
    @JsonAnySetter
    public void setUserExtensions(String key,Object value) {
        //System.out.println(" Key : " + key + " Value : " + value);
        if (userExtensions == null) {
          userExtensions = new HashMap<>();
        }
        userExtensions.put(key,value);
    }
}

以下是用于读取Main.class文件并转换为JSON的{​​{1}}:

JAXB

以下是我的示例 public class Main{ public void xmlConverter(InputStream jsonStream) throws IOException,JAXBException,XMLStreamException { // Get the JSON Factory and parser Object final JsonParser jsonParser = new JsonFactory().createParser(jsonStream); final ObjectMapper objectMapper = new ObjectMapper(); jsonParser.setCodec(objectMapper); jsonParser.nextToken(); // Get the node final JsonNode jsonNode = jsonParser.readValueAsTree(); final Extension extensionInfo = objectMapper.treeTovalue(jsonNode,Extension.class); xmlCreator(extensionInfo,Extension.class); } private void xmlCreator(Object extensionInfo,Class eventType) throws JAXBException{ JAXBContext context = JAXBContext.newInstance(extensionInfo); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE); marshaller.setProperty(Marshaller.JAXB_FRAGMENT,Boolean.TRUE); marshaller.marshal(extensionInfo,System.out); } } 文件,它将作为 JSON 读取和提供:

jsonStream

以下是我的 { "@context": [ { "ns1": "http://ns.google.com/test" } ],"time":"2021-04-06T00:00:00-02:00","step":"business","ns1:customerDetails":{ "ns1:name":"Batman","ns1:age":30 },"ns1:age":30 } } ,它将创建 XMLAdapterJAXBElement

XML

基本上,当我 public class TestAdapter extends XmlAdapter<Map<String,Object>,Map<String,Object>> { @Override public Map<String,Object> marshal(Map<String,Object> extensions) throws Exception,JAXBException { Customer customer = new Customer(); customer.setAge(28); customer.setName("BATMAN"); JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE); jaxbMarshaller.marshal(customer,System.out); } @Override public Map<String,Object> unmarshal(Map<String,Object> valueType) throws Exception { throw new NotImplementedException(); } } 来自 Marshal 扩展的元素时,我想根据另一个user-defined Marshal 它(这只是我使用过的参考,但是实际上,我想从 Customer 方法中的 Map<String,Object> 读取)。

TestAdapter Masshal

public class TestAdapter extends XmlAdapter<Map<String,JAXBException { final Map<String,Object> customerDetails = (Map<String,Object>) extensions.get("ns1:customerDetails"); final String name = (String) agricultureDetails.get("ns1:name"); final Integer age = (Integer) agricultureDetails.get("ns1:age"); Customer customer = new Customer(); customer.setAge(age); customer.setName(name); System.out.println("ONE"); JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class); System.out.println("TWO"); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Object> valueType) throws Exception { throw new NotImplementedException(); } } 类是这里引用的基本类:

Customer

我面临的问题是 @XmlRootElement @Getter @Setter @NoArgsConstructor @AllArgsConstructor @XmlAccessorType(XmlAccesstype.FIELD) public class Customer { private String name; private int age; } 类中的 JAXB marshalling 正在命中 Main 方法并能够获得 TestAdapter Marshalling(由于 ONE方法)在控制台中但不是 System.out 意味着它不会创建另一个 TWO 但它也不会抛出错误

我想知道以下事情:

  1. 我是否正确地执行了 JAXBContext
  2. 我可以在另一个 Jaxb marshalling 中创建一个 JaxbContext 吗?
  3. 如何在 JaxbContext 类中为我的用户定义的 XML 创建 Extensions 并将其添加TestAdapter 的主 XML

我知道我可能会得到以下几个答案,所以我将尝试回答为什么我不能使用某些方法

有人可能会说将 MAIN.class 字段定义为 Extension 问题是这些字段是从 private Customer extension 文件中读取的,并且这些字段是用户定义的,因此没有特定的专用元素所以我使用 JSON获取元素,然后使用 Map<String,Object> 方法

我知道这个问题有点复杂,但我已经尽力通过一些非常简单的例子来解释。如果您需要任何进一步的说明,那么我很乐意提供相同的信息。我一整天都在思考,但没有任何结果,现有的方法也不起作用,所以我想我会在这里从社区成员那里得到一些意见。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?