【问题标题】:Convert Json to XML in Java with Staxon使用 Staxon 在 Java 中将 Json 转换为 XML
【发布时间】:2019-12-20 20:52:55
【问题描述】:

我正在尝试将 Json 转换为 XML

public static String jsonToXML1(String source) {
    String xmlString = null;

    try {
        StringWriter stringWriter = new StringWriter();
        InputStream inputStream = new ByteArrayInputStream(source.getBytes("UTF-8"));
        JsonXMLConfig config = new JsonXMLConfigBuilder().virtualRoot("root").autoPrimitive(false).autoArray(true).multiplePI(true).build();
        XMLStreamReader streamReader = new JsonXMLInputFactory(config).createXMLStreamReader(inputStream);
        Source source1 = new StAXSource(streamReader);
        TransformerFactory tf = TransformerFactory.newInstance("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", null);

        tf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        tf.newTransformer().transform(source1, new StreamResult(stringWriter));

        xmlString = stringWriter.getBuffer().toString();
    } catch (Exception e) {}

    return xmlString;
}

System.out.println(jsonToXML1("[{\"ID\":\"a\"},{\"ID\":\"b\"}]"));

但是当我用[{"ID":"a"},{"ID":"b"}] 调用它时,我得到的是<root><ID>a</ID></root> 而不是

<root><element><ID>a</ID></element><element><ID>b</ID></element></root>

<root><ID>a</ID><ID>b</ID></root>

如果对象不包含数组,这似乎可以正常工作。
在数组的情况下,仅转换第一个元素。
你能指出我如何转换所有数组元素吗?

【问题讨论】:

  • 您已经标记了这个撒克逊人,并在问题中提到了撒克逊人,但我认为您的代码中没有使用撒克逊人(它明确调用了 Xalan)。所以我很困惑。这实际上似乎是关于一些 JsonXMLConfig 库的问题。
  • 我看到 JsonXMLConfig 在“staxon”产品中,除了(故意?)选择了一个令人困惑的相似名称之外,它与 saxon 完全没有联系。
  • 对此感到抱歉,感谢您的纠正。我在想那是撒克逊图书馆。
  • 感谢@Valentyn Kolesnikov,不幸的是我试图避免添加新的依赖项
  • @lonut 是开源库。您可以将源代码复制到您的项目中。

标签: java json xml


【解决方案1】:

Underscore-java 库有静态方法U.jsonToXml(json)。我是项目的维护者。

U.jsonToXml("[{\"ID\":\"a\"},{\"ID\":\"b\"}]");

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <element>
    <ID>a</ID>
  </element>
  <element>
    <ID>b</ID>
  </element>
</root>

【讨论】:

    【解决方案2】:

    以下示例适用于 json 到 xml 的转换,包括 xml 属性。

    输入 JSON:{"Header":{"From":{"Credential":[{"@domain":"AribaNetworkUserId","@type":"marketplace","Identity":"bigadmin@marketplace.org"},{"@domain":"AribaNetworkUserId","@type":"marketplace","Identity":"bigadmin@marketplace.org"}]},"To":{"Credential":[{"@domain":"AribaNetworkUserId","@type":"marketplace","Identity":"bigadmin@marketplace.org"},{"@domain":"AribaNetworkUserId","@type":"marketplace","Identity":"bigadmin@marketplace.org"}]},"Sender":{"Credential":[{"@domain":"AribaNetworkUserId","Identity":"dchen@ariba.com","SharedSecret":"password"},{"@domain":"AribaNetworkUserId","Identity":"dchen@ariba.com","SharedSecret":"password"}],"UserAgent":"Ariba Network V1.1"}}}

    XML 输出:&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;Header&gt;&lt;From&gt;&lt;Credential domain="AribaNetworkUserId" type="marketplace"&gt;&lt;Identity&gt;bigadmin@marketplace.org&lt;/Identity&gt;&lt;/Credential&gt;&lt;Credential domain="AribaNetworkUserId" type="marketplace"&gt;&lt;Identity&gt;bigadmin@marketplace.org&lt;/Identity&gt;&lt;/Credential&gt;&lt;/From&gt;&lt;To&gt;&lt;Credential domain="AribaNetworkUserId" type="marketplace"&gt;&lt;Identity&gt;bigadmin@marketplace.org&lt;/Identity&gt;&lt;/Credential&gt;&lt;Credential domain="AribaNetworkUserId" type="marketplace"&gt;&lt;Identity&gt;bigadmin@marketplace.org&lt;/Identity&gt;&lt;/Credential&gt;&lt;/To&gt;&lt;Sender&gt;&lt;Credential domain="AribaNetworkUserId"&gt;&lt;Identity&gt;dchen@ariba.com&lt;/Identity&gt;&lt;SharedSecret&gt;password&lt;/SharedSecret&gt;&lt;/Credential&gt;&lt;Credential domain="AribaNetworkUserId"&gt;&lt;Identity&gt;dchen@ariba.com&lt;/Identity&gt;&lt;SharedSecret&gt;password&lt;/SharedSecret&gt;&lt;/Credential&gt;&lt;UserAgent&gt;Ariba Network V1.1&lt;/UserAgent&gt;&lt;/Sender&gt;&lt;/Header&gt;

    源代码:

    import com.sun.xml.internal.stream.XMLOutputFactoryImpl;
    import de.odysseus.staxon.json.JsonXMLConfig;
    import de.odysseus.staxon.json.JsonXMLConfigBuilder;
    import de.odysseus.staxon.json.JsonXMLInputFactory;
    import de.odysseus.staxon.json.JsonXMLOutputFactory;
    import org.apache.commons.lang.StringUtils;
    
    import javax.xml.stream.XMLEventReader;
    import javax.xml.stream.XMLEventWriter;
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.stream.StreamResult;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class StaxonJsonXmlConverter implements JsonXmlConverter {
    
        public String jsonToXml(String json) throws ConverterException {
    
    InputStream input = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
    
            JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(isMultiplePI()).prettyPrint(false).build();
            try {
                /*
                 * Create reader (JSON).
                 */
                XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(input, ServiceConstants.UTF_8);
    
                /*
                 * Create writer (XML). I don't love using the internal XMLOutputFactoryImpl directly, but the
                 * alternative is to use the VM option:
                 * -Djavax.xml.stream.XMLOutputFactory=com.sun.xml.internal.stream.XMLOutputFactoryImpl'
                 * which is basically just like instantiating it directly, right??
                 */
                XMLEventWriter writer = new XMLOutputFactoryImpl().createXMLEventWriter(output, ServiceConstants.UTF_8);
    
                /*
                 * Copy events from reader to writer.
                 */
                writer.add(reader);
    
                /*
                 * Close reader/writer.
                 */
                reader.close();
                writer.close();
    
                return output.toString();
    
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 2016-07-17
      • 2013-11-27
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多