Java 如何使用二进制数据内容将XML转换为Json
我尝试将xml转换为json。它适用于正常的文本数据内容。当xml标记中的数据是二进制数据时,我们无法将xml解组为java对象。您能帮助分享一下我们如何将xml转换成二进制的json吗 Java代码:Java 如何使用二进制数据内容将XML转换为Json,java,json,xml,converters,Java,Json,Xml,Converters,我尝试将xml转换为json。它适用于正常的文本数据内容。当xml标记中的数据是二进制数据时,我们无法将xml解组为java对象。您能帮助分享一下我们如何将xml转换成二进制的json吗 Java代码: public <T> String xmlToJson(Class<T> clazz, String xmlString, boolean includeRoot) throws CustomException { StringWriter writer = ne
public <T> String xmlToJson(Class<T> clazz, String xmlString, boolean includeRoot) throws CustomException {
StringWriter writer = new StringWriter();
String jsonString = "{}";
try {
XMLInputFactory xif = XMLInputFactory.newInstance();
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
xif.setProperty(XMLInputFactory.SUPPORT_DTD, true);
XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xmlString));
JAXBContext jc = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("eclipselink.media-type", "application/json");
marshaller.setProperty("eclipselink.json.include-root", includeRoot);
marshaller.setProperty(MarshallerProperties.JSON_ATTRIBUTE_PREFIX, "@");
JAXBElement<T> addressFromXML = unmarshaller.unmarshal(xsr, clazz); //ERROR at this line for binary data
marshaller.marshal(addressFromXML, writer);
jsonString = writer.toString();
} catch (Exception e) {
logger.error(e.getMessage());
throw new CustomException(e.getMessage());
}
return jsonString;
}
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/mail/internet/MimeMultipart] with root cause
java.lang.NoClassDefFoundError: javax/mail/internet/MimeMultipart
at org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper.initializeDataTypes(XMLBinaryDataHelper.java:74)
at org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper.<init>(XMLBinaryDataHelper.java:54)
at org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper.getXMLBinaryDataHelper(XMLBinaryDataHelper.java:60)
at org.eclipse.persistence.internal.oxm.XMLInlineBinaryHandler.endElement(XMLInlineBinaryHandler.java:126)
at org.eclipse.persistence.internal.oxm.record.deferred.EndElementEvent.processEvent(EndElementEvent.java:37)
at org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler.executeEvents(DeferredContentHandler.java:64)
at org.eclipse.persistence.internal.oxm.record.deferred.BinaryMappingContentHandler.executeEvents(BinaryMappingContentHandler.java:75)
at org.eclipse.persistence.internal.oxm.record.deferred.BinaryMappingContentHandler.processSimpleElement(BinaryMappingContentHandler.java:67)
at org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler.endElement(DeferredContentHandler.java:122)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parseEvent(XMLStreamReaderReader.java:150)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:100)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:87)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:1016)
at org.eclipse.persistence.internal.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:657)
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:460)
公共字符串xmlToJson(类clazz、字符串xmlString、布尔includeRoot)引发CustomException{
StringWriter编写器=新的StringWriter();
字符串jsonString=“{}”;
试一试{
XMLInputFactory xif=XMLInputFactory.newInstance();
xif.setProperty(XMLInputFactory.IS_支持外部实体,false);
xif.setProperty(XMLInputFactory.SUPPORT\u DTD,true);
XMLStreamReader xsr=xif.createXMLStreamReader(新的StringReader(xmlString));
JAXBContext jc=JAXBContext.newInstance(clazz);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
setProperty(“eclipselink.media type”,“application/json”);
setProperty(“eclipselink.json.include root”,includeRoot);
setProperty(MarshallerProperties.JSON_属性_前缀“@”);
JAXBElement addressFromXML=unmarshaller.unmarshal(xsr,clazz);//二进制数据此行出错
marshaller.marshall(addressFromXML,writer);
jsonString=writer.toString();
}捕获(例外e){
logger.error(例如getMessage());
抛出新的CustomException(例如getMessage());
}
返回jsonString;
}
以下是错误信息:
public <T> String xmlToJson(Class<T> clazz, String xmlString, boolean includeRoot) throws CustomException {
StringWriter writer = new StringWriter();
String jsonString = "{}";
try {
XMLInputFactory xif = XMLInputFactory.newInstance();
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
xif.setProperty(XMLInputFactory.SUPPORT_DTD, true);
XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xmlString));
JAXBContext jc = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("eclipselink.media-type", "application/json");
marshaller.setProperty("eclipselink.json.include-root", includeRoot);
marshaller.setProperty(MarshallerProperties.JSON_ATTRIBUTE_PREFIX, "@");
JAXBElement<T> addressFromXML = unmarshaller.unmarshal(xsr, clazz); //ERROR at this line for binary data
marshaller.marshal(addressFromXML, writer);
jsonString = writer.toString();
} catch (Exception e) {
logger.error(e.getMessage());
throw new CustomException(e.getMessage());
}
return jsonString;
}
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/mail/internet/MimeMultipart] with root cause
java.lang.NoClassDefFoundError: javax/mail/internet/MimeMultipart
at org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper.initializeDataTypes(XMLBinaryDataHelper.java:74)
at org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper.<init>(XMLBinaryDataHelper.java:54)
at org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper.getXMLBinaryDataHelper(XMLBinaryDataHelper.java:60)
at org.eclipse.persistence.internal.oxm.XMLInlineBinaryHandler.endElement(XMLInlineBinaryHandler.java:126)
at org.eclipse.persistence.internal.oxm.record.deferred.EndElementEvent.processEvent(EndElementEvent.java:37)
at org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler.executeEvents(DeferredContentHandler.java:64)
at org.eclipse.persistence.internal.oxm.record.deferred.BinaryMappingContentHandler.executeEvents(BinaryMappingContentHandler.java:75)
at org.eclipse.persistence.internal.oxm.record.deferred.BinaryMappingContentHandler.processSimpleElement(BinaryMappingContentHandler.java:67)
at org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler.endElement(DeferredContentHandler.java:122)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parseEvent(XMLStreamReaderReader.java:150)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:100)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:87)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:1016)
at org.eclipse.persistence.internal.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:657)
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:460)
路径为[]的上下文中Servlet[dispatcherServlet]的Servlet.service()引发了异常[Handler dispatch failed;嵌套异常为java.lang.NoClassDefFoundError:javax/mail/internet/MimeMultipart],并带有根本原因
java.lang.NoClassDefFoundError:javax/mail/internet/MimeMultipart
位于org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper.initializeDataTypes(XMLBinaryDataHelper.java:74)
位于org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper。(XMLBinaryDataHelper.java:54)
位于org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper.getXMLBinaryDataHelper(XMLBinaryDataHelper.java:60)
位于org.eclipse.persistence.internal.oxm.XMLInlineBinaryHandler.endElement(XMLInlineBinaryHandler.java:126)
位于org.eclipse.persistence.internal.oxm.record.deferred.EndElementEvent.processEvent(EndElementEvent.java:37)
位于org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler.executeEvents(DeferredContentHandler.java:64)
位于org.eclipse.persistence.internal.oxm.record.deferred.BinaryMappingContentHandler.executeEvents(BinaryMappingContentHandler.java:75)
位于org.eclipse.persistence.internal.oxm.record.deferred.BinaryMappingContentHandler.processSimpleElement(BinaryMappingContentHandler.java:67)
位于org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler.endElement(DeferredContentHandler.java:122)
位于org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parseEvent(XMLStreamReaderReader.java:150)
位于org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:100)
位于org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:87)
位于org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:1016)
位于org.eclipse.persistence.internal.oxm.xmlumarshaller.unmarshal(xmlumarshaller.java:657)
位于org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:460)
类路径上缺少java邮件api
如果您使用的是maven,您应该能够通过添加布局依赖项来修复此问题:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
</dependency>
javax.mail
但二进制数据内容失败
——错误在哪里?如果您不在try/catch块中吞咽异常,这将很有帮助……您好@rkosegi,我刚刚更新了我的问题,其中包括堆栈跟踪。这是我第一次尝试将包含二进制内容的xml解析为object,并从object解析为json。二进制内容下划线java库有一个静态方法U.xmlToJson(xmlstring)。谢谢rkosegi。它运行良好。我仍然不明白为什么javax.mail会涉及到从xml到对象的解组。您能帮我解释一下吗?在我添加库javax.mail javax.mail-api 1.6.2@John之后,非常感谢大家对java-mail-api的需求。现在我明白了。对于文本数据,它不调用第三方LIB。对于二进制数据,它调用第三方libs(javax.mailapi)来处理解析器。谢谢你的解释。