Java 从未知的JAXBContext(XML)为JSON创建封送拆收器

Java 从未知的JAXBContext(XML)为JSON创建封送拆收器,java,json,jaxb,marshalling,Java,Json,Jaxb,Marshalling,我必须使用一个lib,它只给我一个JAXBContext来marshall和unmarshall XML数据到Java对象。此外,我从未见过XML:只有JAXB对象被传递给我。我现在需要的不是将这些对象转换为XML,而是转换为JSON 有没有一种方法可以从给定的JAXBContext创建封送拆收器,用于生成JSON输出? 情况是,我不仅在转换数据。我还拥有作用于XML和JSON之间的Java对象(并操纵数据)的逻辑。这也是一种双向转换。JAXBContext是我所掌握的关于XML和Java对象之

我必须使用一个lib,它只给我一个JAXBContext来marshall和unmarshall XML数据到Java对象。此外,我从未见过XML:只有JAXB对象被传递给我。我现在需要的不是将这些对象转换为XML,而是转换为JSON

有没有一种方法可以从给定的JAXBContext创建封送拆收器,用于生成JSON输出?


情况是,我不仅在转换数据。我还拥有作用于XML和JSON之间的Java对象(并操纵数据)的逻辑。这也是一种双向转换。JAXBContext是我所掌握的关于XML和Java对象之间转换的信息——我的意图是重用这些上下文信息,因为不必使用与JAXB不同的第二种技术实现第二种转换。JAXBContext(及其Java对象)已经有了关于XML结构的信息;JAXB对该结构的自动识别是使用它节省时间的原因。

如果您的JAXB类只使用基本注释,您可以查看一下,它允许Jackson mapper识别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>
XML

结果

{"hello":"JAXB","world":"Jackson"}

更新
另见。MOXy似乎也提供了这种支持。

如何尝试先转换XML,然后再转换为类似Json的格式???或者可能需要实现合适的xml解析器来将xml内容转换为所需的Json格式!!问题是我不仅在转换数据。我还有一些逻辑必须作用于XML和JSON之间的Java对象。这也是一种双向转换。JAXBContext是我掌握的关于XML和Java对象之间转换的信息——我的意图是重用该上下文信息,而不必使用与JAXB不同的第二种技术实现第二种转换。JAXBContext(及其Java对象)已经有了关于XML结构的信息;JAXB对该结构的自动识别是使用它节省时间的原因。只有JAXB对象被传递给我。(将此添加到问题中)效果非常好!是否可以仅通过配置Jackson来更改JSON表示?记住:我没有对带有注释的Java类的写访问权。在我当前的设置中(我只需要包括测试的最后四行),测试中包含诸如“scope”、“globalScope”和“typesubstituted”之类的对象元素。我想编辑这些细节,只输出数据(名称、属性和元素内容)。这可能吗?这足以让传入的JSON再次传输到JAXBElements吗?不确定额外的元素。但对于解组,请查看用于解组的
ObjectMapper.readValue(…)
方法,该方法似乎不是双向转换:,异常:
由以下原因引起:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:Unrecogned字段“name”(class.net.opengis.wps.v_1_0_0.GetCapabilities),未标记为可忽略(3个已知属性:“language”、“AcceptVersions”、“service”])
这是因为这些额外的属性不是jaxb类的一部分。对上面的示例,解组是有效的。我不确定如何消除这些属性。请尝试使用
new ObjectMapper()创建ObjectMapper。配置(UNKNOWN属性上的DeserializationFeature.FAIL,false);
<?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"}