Schnellster Weg, um XML in JSON in Java zu konvertieren [geschlossen]

171

Was sind einige gute Tools für die schnelle und einfache Konvertierung von XML in JSON in Java?

BeachRunnerFred
quelle
Ich kann XML aufgrund einer Anforderung in der Spezifikation nicht direkt verwenden, aber ich stimme Ihnen zu. Vielen Dank!
BeachRunnerFred
@BeachRunnerJoe: Welchen Import muss ich schreiben? import net.sf.json.JSONObject;oder import org.json.JSONObject;. Auch welches Glas muss ich einschließen?
Fahim Parkar
1
Hier ist ein Link zu einer Möglichkeit, mit JAXP ohne Abhängigkeiten vorzugehen
bvdb
16
Ich liebe die geschlossenen Fragen von SO, die eine so hohe Sichtbarkeit haben ... Irgendwo ist etwas schiefgegangen, wenn eine so nützliche Frage geschlossen wurde.
Dariusz
2
Ich denke, 90% der nützlichsten Fragen sind "Abgeschlossenes Thema". smh
Jeryl Cook

Antworten:

188

JSON in Java verfügt über einige großartige Ressourcen.

Maven-Abhängigkeit:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20180813</version>
</dependency>

XML.java ist die Klasse, die Sie suchen:

import org.json.JSONObject;
import org.json.XML;

public class Main {

    public static int PRETTY_PRINT_INDENT_FACTOR = 4;
    public static String TEST_XML_STRING =
        "<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to JSON</test>";

    public static void main(String[] args) {
        try {
            JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
            String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
            System.out.println(jsonPrettyPrintString);
        } catch (JSONException je) {
            System.out.println(je.toString());
        }
    }
}

Ausgabe ist:

{"test": {
    "attrib": "moretest",
    "content": "Turn this to JSON"
}}
danieltalsky
quelle
14
Warnung: Das Paket json.org.XML ist in Android nicht vorhanden!
Ludovic Landry
2
@danieltalsky: Welchen Import muss ich schreiben? import net.sf.json.JSONObject;oder import org.json.JSONObject;. Auch welches Glas muss ich einschließen?
Fahim Parkar
2
Laden Sie alle Dateien herunter, nicht nur XML.java. Von hier: github.com/douglascrockford/JSON-java/downloads
Spiff
4
Was ist, wenn Sie eine haben <test attrib="moretest" content="foo">bar</test>?
wchargin
1
HINWEIS: XML.toJSONObject () von org.json konvertiert auch XML-Listen korrekt in JSON-Arrays (im Gegensatz zu Jacksons XmlMapper, der standardmäßig stillschweigend verschluckt wird).
Agoston Horvath
58

Um XML-Dateien in JSON zu konvertieren, müssen Sie die folgende Abhängigkeit berücksichtigen

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>

und Sie können Jar aus dem Maven Repository hier herunterladen . Dann implementieren Sie als:

String soapmessageString = "<xml>yourStringURLorFILE</xml>";
JSONObject soapDatainJsonObject = XML.toJSONObject(soapmessageString);
System.out.println(soapDatainJsonObject);
Kishan Bheemajiyani
quelle
5
+ für Maven-Abhängigkeit zur Verfügung gestellt
Zacheusz
2
Verwenden Sie die im Beitrag erwähnte Version von json, wenn Sie mit Java 7 arbeiten, da die neueste Version seltsame Fehler verursacht.
Urug
Wenn Sie eine gültige dtd-Datei für das XML-Snippet haben, können Sie XML mithilfe des Open-Source-Eclipse-Link-Jars problemlos in JSON und JSON in XML konvertieren. Ein detailliertes Beispiel für ein JAVA-Projekt finden Sie hier: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia
Ich musste das gesamte JSON-Paket in mein Projekt kopieren und das Paket umbenennen. Das Hinzufügen zu gradle warnt vor doppelten Paketen von Android während des Builds.
Codelearner
28

Das einzige Problem mit JSON in Java besteht darin, dass Ihr XML, wenn es ein einzelnes untergeordnetes Element hat, aber ein Array ist, es in ein Objekt anstelle eines Arrays konvertiert. Dies kann zu Problemen führen, wenn Sie dynamisch immer von XML nach JSON konvertieren. Wenn Ihr Beispiel-XML nur ein Element enthält, geben Sie ein Objekt zurück. Wenn es jedoch 2+ enthält, geben Sie ein Array zurück, was bei Benutzern, die das verwenden, zu Analyseproblemen führen kann JSON.

Die XML2JSON- Klasse von Infoscoop bietet die Möglichkeit, Elemente, die Arrays sind, vor der Konvertierung zu kennzeichnen , sodass Arrays ordnungsgemäß zugeordnet werden können, selbst wenn das XML nur ein untergeordnetes Element enthält .

Hier ist ein Beispiel für die Verwendung (in einer etwas anderen Sprache, aber Sie können auch sehen, wie Arrays mithilfe der nodelist2json () -Methode des XML2JSON-Links verwendet werden).

Marcus
quelle
Wir verwenden eine "xml-to-json" -Bibliothek in Python und dies ist ein semantisches Problem. Um dieses "Array- oder Objekt" -Problem zu lösen, schreiben wir eine "tryConvertToArray ()" - Methode, die ein Array mit dem einzelnen Objekt zurückgibt. Sie können also immer darauf vertrauen, dass Ihr Wert ein Array ist
kommradHomer
Mir ist nicht klar, wie das das Problem löst. Machen Sie dann einfach alles zu einem Array anstelle eines Objekts? ZB, wenn ich das XML habe <results><result><value>1</value></result></results>, würde es erzeugen { "results" : { "result" : { "value" : "1" } } } oder { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus
Wir erwarten, dass es sich um ein Array handelt. Das Problem tritt auf, wenn dieses Array nur 1 Element enthält und somit ein Objekt für den XML-zu-JSON-Konverter ist. Da wir davon ausgehen, dass dies auch nur für ein einzelnes Element ein Array ist, überprüfen wir es und konvertieren es in ein Array. Dabei stellen wir sicher, dass wir ein Array haben, in dem wir ein Array erwarten.
kommradHomer
Aber wie erwarten Sie, dass ein bestimmtes Element ein Array ist? XML2JSON markiert die Elemente. Es ist nicht klar, wie man erwartet, dass es sich um ein Array handelt, ohne es zu markieren, da man es sonst mit einem einzelnen Element 'Array' nie erfahren würde.
Marcus
Zum Beispiel gibt es ein Element namens "Telefonnummern". Und es gibt 1 oder mehr "Telefonnummern" -Elemente im "Telefonnummern" -Element. Wenn es also nur ein "Telefonnummern" -Element in "Telefonnummern" gibt, erstellt xml2json ein Telefonnummernobjekt, aber ich erstelle ein Telefonnummernarray und füge das Telefonnummernobjekt darin ein.
kommradHomer
2

Ich fand das schnell und einfach: Verwendet: org.json.XMLKlasse von java-json.jar

if (statusCode == 200 && inputStream != null) {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    StringBuilder responseStrBuilder = new StringBuilder();

    String inputStr;
    while ((inputStr = bufferedReader.readLine()) != null) {
        responseStrBuilder.append(inputStr);
    }

    jsonObject = XML.toJSONObject(responseStrBuilder.toString());
}
Horizont7
quelle
1

Ich weiß nicht, was genau Ihr Problem ist, aber wenn Sie XML empfangen und JSON (oder etwas anderes) zurückgeben möchten, können Sie sich auch JAX-B ansehen. Dies ist ein Standard für das Marshalling / Unmarshalling von Java-POJOs in XML und / oder Json. Es gibt mehrere Bibliotheken, die JAX-B implementieren, beispielsweise Apaches CXF.

Martin Sturm
quelle