从未知的JAXBContext(XML)创建JSON的Marshaller

塞巴斯蒂安·巴特(Sebastian Barth)

我必须使用一个只给我一个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>
  • 参见github上的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

创建JAXBContext实例时出现IndexOutOfBoundsException

忽略数组元素的父标记xml标记JAXBContext

Quarkus中的SOAP Web服务因未知的JAXBContext实现而失败

如何创建采用通用对象的JAXB Marshaller

错误:javax.xml.bind.JAXBContext(命令行)

从未知对象获取属性和值

从未知(对我来说)编码中删除不可打印的空格

使用漂亮的汤从未知数量的页面抓取数据

错误编号:33:尝试使用SeleniumBasic模拟Chrome浏览器时,SessionNotCreatedError会话未从未知错误创建异常

从未知接口获取属性

使用操纵up从未知的li检索数据

从未知的动态对象中删除特定的已知属性

从未知类获取数据的首选方式是什么

从未知文件系统硬盘恢复数据

Hibernate 4.2.2从未知长度的输入流创建Blob

从未知大小的文件描述符中完全读取

PHP从未知数量的文本输入中获取值

如何从未知类型的变量访问嵌套类型?

ListBox ItemSource绑定从未知原因请求Dependency属性

使用JAXBContext为输入StringReader创建空对象

UnmarshalException:XML上的意外元素只是Marshaller

从未知IP轨道访问不存在的网站

从未知的派生类调用接口函数(多重继承)

从未知对象数组制作HTML表

从未知长度的列表中创建嵌套字典

RIDE WebDriverException:消息:未从未知错误创建会话异常

Jaxb2Marshaller 如何保存 JAXBContext

使用 JAXBContext 将 XML 转换为 Java 类

如何从未知中正确调用 toString?