我必须使用一个只给我一个JAXBContext的库来编组和解组XML数据到Java对象。而且我从没看过XML:只有JAXB对象被传递给我。我现在需要的是将这些对象不是转换为XML,而是转换为JSON。
有没有一种方法可以从给定的JAXBContext创建可用于生成JSON输出的编组器?
情况是,我不仅在转换数据。我也有作用于XML和JSON之间的Java对象(并处理数据)的逻辑。这也是双向转换。JAXBContext是我掌握的有关XML和Java对象之间的转换的信息-我的意图是重用此上下文信息,而不必用不同于JAXB的第二种技术来实现第二次转换。JAXBContext(及其Java对象)已经具有有关XML结构的信息;请参阅参考资料。JAXB对该结构的自动识别是节省时间的原因。
如果您的JAXB类仅使用基本注释,则可以看一下JacksonJAXBAnnotations,它允许Jackson映射器识别JAXN注释。您只需要四行代码(在最简单的编组情况下)。
ObjectMapper mapper = new ObjectMapper();
JaxbAnnotationModule module = new JaxbAnnotationModule();
mapper.registerModule(module);
mapper.writeValue(System.out, yourJaxbObject);
您可以在上方看到所有支持的注释的链接。您需要的Maven工件是
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.4.0</version>
</dependency>
jackson-module-jaxb-annotations
-请注意,此工件jackson-core
与和有关jackson-databind
。因此,如果您不使用Maven,则还需要确保也下载这些工件。简单示例:
JAXB类
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"hello",
"world"
})
@XmlRootElement(name = "root")
public class Root {
@XmlElement(required = true)
protected String hello;
@XmlElement(required = true)
protected String world;
// Getters and Setters
}
XML格式
<?xml version="1.0" encoding="UTF-8"?>
<root>
<hello>JAXB</hello>
<world>Jackson</world>
</root>
测试
public class TestJaxbJackson {
public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
InputStream is = TestJaxbJackson.class.getResourceAsStream("test.xml");
Root root = (Root)unmarshaller.unmarshal(is);
System.out.println(root.getHello() + " " + root.getWorld());
ObjectMapper mapper = new ObjectMapper();
JaxbAnnotationModule module = new JaxbAnnotationModule();
mapper.registerModule(module);
mapper.writeValue(System.out, root);
}
}
结果
{"hello":"JAXB","world":"Jackson"}
另请参阅这篇文章。看起来MOXy也提供了这种支持。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句