Modo più rapido per convertire XML in JSON in Java [chiuso]


171

Quali sono alcuni buoni strumenti per convertire rapidamente e facilmente XML in JSON in Java?


non posso usare XML direttamente a causa di un requisito nelle specifiche, ma sono d'accordo con te. Grazie!
BeachRunnerFred

@BeachRunnerJoe: quale importazione devo scrivere? import net.sf.json.JSONObject;oppure import org.json.JSONObject;. Inoltre quale vaso devo includere?
Fahim Parkar,

1
Ecco un link ad un modo per farlo senza dipendenze, usando JAXP: stackoverflow.com/questions/27222992/...
bvdb

16
Adoro le domande chiuse di SO che hanno una visibilità così alta ... Qualcosa è andato storto da qualche parte se una domanda così utile è stata chiusa.
Dariusz,

2
penso che il 90% delle domande più utili siano "Argomento chiuso" .. smh
Jeryl Cook,

Risposte:


188

JSON in Java ha alcune grandi risorse.

Dipendenza da Maven:

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

XML.java è la classe che stai cercando:

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

L'output è:

{"test": {
    "attrib": "moretest",
    "content": "Turn this to JSON"
}}

14
Attenzione: il pacchetto json.org.XML non esiste in Android!
Ludovic Landry,

2
@danieltalsky: quale importazione devo scrivere? import net.sf.json.JSONObject;oppure import org.json.JSONObject;. Inoltre quale vaso devo includere?
Fahim Parkar,

2
scarica tutti i file non solo XML.java. Da qui: github.com/douglascrockford/JSON-java/downloads
Spiff

4
E se hai un <test attrib="moretest" content="foo">bar</test>?
wchargin,

1
NOTA: XML.toJSONObject () di org.json converte correttamente anche gli elenchi xml in array json (a differenza di XmlMapper di jackson che di default ingoia silenziosamente).
Agoston Horvath,

58

Per convertire il file XML in JSON includere la seguente dipendenza

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

e puoi scaricare Jar dal repository Maven qui . Quindi implementare come:

String soapmessageString = "<xml>yourStringURLorFILE</xml>";
JSONObject soapDatainJsonObject = XML.toJSONObject(soapmessageString);
System.out.println(soapDatainJsonObject);

5
+ per la dipendenza da
forno

2
usa la versione di json menzionata nel post se sei su java 7 poiché l'ultima versione genera strani errori.
urug

Se si dispone di un file dtd valido per lo snippet xml, è possibile convertire facilmente xml in json e json in xml utilizzando il barattolo di collegamento eclipse open source. Un esempio dettagliato di progetto JAVA è disponibile qui: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia

Ho dovuto copiare l'intero pacchetto JSON nel mio progetto e ho rinominato il pacchetto. L'aggiunta a Gradle avvisa del pacchetto duplicato di Android durante la compilazione.
studente di codici

28

L'unico problema con JSON in Java è che se il tuo XML ha un unico figlio, ma è un array, lo convertirà in un oggetto anziché in un array. Ciò può causare problemi se si converte sempre dinamicamente da XML a JSON, dove se l'XML di esempio ha solo un elemento, si restituisce un oggetto, ma se ha 2+, si restituisce un array, che può causare problemi di analisi per le persone che utilizzano il JSON.

La classe XML2JSON di Infoscoop ha un modo di taggare gli elementi che sono array prima di eseguire la conversione, in modo che gli array possano essere mappati correttamente, anche se nell'XML è presente un solo figlio.

Ecco un esempio di come usarlo (in una lingua leggermente diversa, ma puoi anche vedere come vengono usate le matrici dal metodo nodelist2json () del link XML2JSON).


stiamo usando una libreria "xml-to-json" in Python e questo è un problema semantico. Quello che facciamo per risolvere questo problema "array o oggetto", è scrivere un metodo "tryConvertToArray ()", che restituisce un array con il singolo oggetto al suo interno. Quindi, puoi sempre fidarti del tuo valore come array
kommradHomer,

Non mi è chiaro come questo risolva il problema. Allora trasformi tutto in un array anziché in un oggetto? Ad esempio, se avessi l'XML <results><result><value>1</value></result></results>, genererebbe { "results" : { "result" : { "value" : "1" } } } o { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus il

C'è qualcosa che ci aspettiamo che sia un array. Il problema sorge quando questo array ha solo 1 elemento, rendendolo un oggetto per il convertitore da xml a json. Quindi, poiché prevediamo che questo sia un array anche per un singolo elemento, lo controlliamo e lo convertiamo in un array, assicurandoci di disporre di un array in cui prevediamo un array.
kommradHomer,

Ma come ti aspetti che un elemento specifico sia un array? XML2JSON contrassegna gli elementi. Non è chiaro come aspettarsi che sia un array senza etichettarlo, poiché altrimenti non lo sapresti mai con un singolo elemento "array".
Marcus,

Ad esempio, esiste un elemento chiamato "phonenumbers". E ci sono 1 o più elementi "phonenumber" nell'elemento "phonenumbers". Quindi, quando esiste un solo elemento "numero di telefono" in "numeri di telefono", xml2json crea un oggetto numero di telefono, ma io creo un array numero di telefono e inserisco l'oggetto numero di telefono.
kommradHomer,


2

Ho trovato questo in modo semplice e veloce: usato: org.json.XMLclasse da 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

Non so quale sia il tuo esatto problema, ma se stai ricevendo XML e vuoi restituire JSON (o qualcosa del genere) potresti anche guardare JAX-B. Questo è uno standard per il marshalling / il non marshalling di POJO Java su XML e / o Json. Esistono più librerie che implementano JAX-B, ad esempio CXF di Apache.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.