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?


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"
}}

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);

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).


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());
}

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.