Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用二进制数据内容将XML转换为Json_Java_Json_Xml_Converters - Fatal编程技术网

Java 如何使用二进制数据内容将XML转换为Json

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

我尝试将xml转换为json。它适用于正常的文本数据内容。当xml标记中的数据是二进制数据时,我们无法将xml解组为java对象。您能帮助分享一下我们如何将xml转换成二进制的json吗

Java代码

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)来处理解析器。谢谢你的解释。