以下示例适用于 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 输出:<?xml version="1.0" encoding="UTF-8"?><Header><From><Credential domain="AribaNetworkUserId" type="marketplace"><Identity>bigadmin@marketplace.org</Identity></Credential><Credential domain="AribaNetworkUserId" type="marketplace"><Identity>bigadmin@marketplace.org</Identity></Credential></From><To><Credential domain="AribaNetworkUserId" type="marketplace"><Identity>bigadmin@marketplace.org</Identity></Credential><Credential domain="AribaNetworkUserId" type="marketplace"><Identity>bigadmin@marketplace.org</Identity></Credential></To><Sender><Credential domain="AribaNetworkUserId"><Identity>dchen@ariba.com</Identity><SharedSecret>password</SharedSecret></Credential><Credential domain="AribaNetworkUserId"><Identity>dchen@ariba.com</Identity><SharedSecret>password</SharedSecret></Credential><UserAgent>Ariba Network V1.1</UserAgent></Sender></Header>
源代码:
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();
}
}