Java 从未知的JAXBContext(XML)为JSON创建封送拆收器
我必须使用一个lib,它只给我一个JAXBContext来marshall和unmarshall XML数据到Java对象。此外,我从未见过XML:只有JAXB对象被传递给我。我现在需要的不是将这些对象转换为XML,而是转换为JSON 有没有一种方法可以从给定的JAXBContext创建封送拆收器,用于生成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对象之
情况是,我不仅在转换数据。我还拥有作用于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"}