Im folgenden wird die Umwandlung von JSON in XML mit Java beschrieben. Die JSON-lib bietet mit dem JSONSerializer die Möglichkeit nahezu jedes Java-Objekt in die JSON-Notation zu konvertieren. Mit dem XMLSerializer kann man JSON Objekte in die XML-Notation und zurück umwandeln.
Um die JSON-lib benutzen zu können, sind mindestens folgende Libraries zusätzlich notwendig:
- apache commons-lang 2.5 (Achtung >3 funktioniert nicht, da Umbenennung der Packages)
- apache commons-beanutils 1.8.0
- apache commons-collections 3.2.1
- apache commons-logging 1.1.1
- ezmorph 1.0.6
- xom
Vorbereitung
JSON>XML
Im folgenden Beispiel wird ein JSON String erstellt und aus diesem der korrespondierende XML String erstellt. Die Klasse „XMLSerializer“ bietet über die write-Methode alle Voraussetzungen, um diese Aufgabe zu erledigen:
package org.jkhofmann.dyndns;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONSerializer;
import net.sf.json.xml.XMLSerializer;
public class JSON2XMLConverter {
/**
* @param args
*/
public static void main(String[] args) {
String jsonStr = "{'foo':'bar'," +
"'coolness':2.0," +
"'altitude':39000," +
"'pilot':{'firstName':'Buzz'," +
"'lastName':'Aldrin'}," +
"'mission':'apollo 11'}";
XMLSerializer serializer = new XMLSerializer();
JSON json = JSONSerializer.toJSON( jsonStr );
String xml = serializer.write( json );
System.out.println(xml);
}
}
Die (formatierte) Ausgabe:
<?xml version="1.0" encoding="UTF-8"?>
<o>
<altitude type="number">39000</altitude>
<coolness type="number">2.0</coolness>
<foo type="string">bar</foo>
<mission type="string">apollo 11</mission>
<pilot class="object">
<firstName type="string">Buzz</firstName>
<lastName type="string">Aldrin</lastName>
</pilot>
</o>
Will man den Typen-Hinweis ausschalten, gibt man folgenden Befehl „serializer.setTypeHintsEnabled(false);“ vor der Serialisierung ein:
...
JSON json = JSONSerializer.toJSON( jsonStr );
serializer.setTypeHintsEnabled(false);
String xml = serializer.write( json );
...
Die entsprechende Ausgabe sieht dann so aus:
<?xml version="1.0" encoding="UTF-8"?>
<o>
<altitude>39000</altitude>
<coolness>2.0</coolness>
<foo>bar</foo>
<mission>apollo 11</mission>
<pilot>
<firstName>Buzz</firstName>
<lastName>Aldrin</lastName>
</pilot>
</o>
Soll der Name des Wurzel-Knotens von „<o>“ z.B. nach „<SampleJSON>“ umbenannt werden, dann gibt man den Befehl „serializer.setRootName(„SampleJSON“)“ ein. Die Ausgabe sieht dann so aus:
<?xml version="1.0" encoding="UTF-8"?>
<SampleJSON>
<altitude>39000</altitude>
<coolness>2.0</coolness>
<foo>bar</foo>
<mission>apollo 11</mission>
<pilot>
<firstName>Buzz</firstName>
<lastName>Aldrin</lastName>
</pilot>
</SampleJSON>
Hinweis: Will man anstelle eines String einen InputStream umwandeln, leistet die Apache Commons IOUtils Library hilfreiche Dienste.
// is comes as a InputStream object and will be // converted to a String: String jsonData = IOUtils.toString(is);
XML > JSON
Um einen XML String in einen JSON String umzuwandeln, kann man wieder die Klasse „XMLSerializer“ verwenden, diesmal aber über die read-Methode:
JSON jsonout = serializer.read( xml );
Beispiel: Die Klasse wandelt einen JSON String in einen XML String um und anschließend wieder in einen JSON String:
package org.jkhofmann.dyndns;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONSerializer;
import net.sf.json.xml.XMLSerializer;
public class JSON2XMLConverter {
/**
* @param args
*/
public static void main(String[] args) {
// JSON Eingabestring:
String jsonStr = "{'foo':'bar'," +
"'coolness':2.0," +
"'altitude':39000," +
"'pilot':{'firstName':'Buzz'," +
"'lastName':'Aldrin'}," +
"'mission':'apollo 11'}";
// Konvertierung nach XML:
XMLSerializer serializer = new XMLSerializer();
JSON json = JSONSerializer.toJSON( jsonStr );
serializer.setTypeHintsEnabled(false);
serializer.setRootName("SampleJSON");
String xml = serializer.write( json );
System.out.println(xml);
// Konvertierung zurück nach JSON:
JSON jsonout = serializer.read( xml );
System.out.println( jsonout );
}
}
Ausgabe des JSON Strings:
{"altitude":"39000",
"coolness":"2.0",
"foo":"bar",
"mission":"apollo 11",
"pilot":{
"firstName":"Buzz",
"lastName":"Aldrin"
}
}
Links
Wie immer ist ein Großteil der Kenntnisse und Beispiele, de ich hier wiedergebe, nicht auf meinem „eigenen Mist“ gewachsen. Deshalb möchte ich hier die verwendeten Links und weitere Fundstellen nennen:
- JSON-lib Beispiele
- O’Reilly Answers: How to Convert JSON to XML in Java
