如何解决如何在另一个 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
}
}
,它将创建 XMLAdapter
和 JAXBElement
:
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
但它也不会抛出错误。
我想知道以下事情:
- 我是否正确地执行了
JAXBContext
? - 我可以在另一个
Jaxb marshalling
中创建一个JaxbContext
吗? - 如何在
JaxbContext
类中为我的用户定义的XML
创建Extensions
并将其添加到TestAdapter
的主XML
。
我知道我可能会得到以下几个答案,所以我将尝试回答为什么我不能使用某些方法:
有人可能会说将 MAIN.class
字段定义为 Extension
问题是这些字段是从 private Customer extension
文件中读取的,并且这些字段是用户定义的,因此没有特定的专用元素所以我使用 JSON
来获取元素,然后使用 Map<String,Object>
方法。
我知道这个问题有点复杂,但我已经尽力通过一些非常简单的例子来解释。如果您需要任何进一步的说明,那么我很乐意提供相同的信息。我一整天都在思考,但没有任何结果,现有的方法也不起作用,所以我想我会在这里从社区成员那里得到一些意见。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。