Moyen le plus rapide de convertir du XML en JSON en Java [fermé]


171

Quels sont les bons outils pour convertir rapidement et facilement du XML en JSON en Java?


Je ne peux pas utiliser XML directement en raison d'une exigence de la spécification, mais je suis d'accord avec vous. Merci!
BeachRunnerFred

@BeachRunnerJoe: De quelle importation ai-je besoin pour écrire? import net.sf.json.JSONObject;ou import org.json.JSONObject;. Quel pot dois-je également inclure?
Fahim Parkar

1
Voici un lien vers un moyen de le faire sans aucune dépendance, en utilisant JAXP: stackoverflow.com/questions/27222992
...

16
J'adore les questions fermées de SO qui ont une si grande visibilité ... Quelque chose s'est mal passé si une question aussi utile était fermée.
Dariusz

2
Je pense que 90% des questions les plus utiles sont "Sujet fermé" .. smh
Jeryl Cook

Réponses:


188

JSON en Java a d'excellentes ressources.

Dépendance Maven:

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

XML.java est la classe que vous recherchez:

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

La sortie est:

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

14
Attention: le package json.org.XML n'existe pas sous Android!
Ludovic Landry

2
@danieltalsky: De quelle importation ai-je besoin pour écrire? import net.sf.json.JSONObject;ou import org.json.JSONObject;. Quel pot dois-je également inclure?
Fahim Parkar

2
téléchargez tous les fichiers, pas seulement XML.java. De là: github.com/douglascrockford/JSON-java/downloads
Spiff

4
Et si vous avez un <test attrib="moretest" content="foo">bar</test>?
wchargin

1
REMARQUE: XML.toJSONObject () de org.json convertit également correctement les listes XML en tableaux json (contrairement au XmlMapper de jackson qui, par défaut, avale silencieusement).
Agoston Horvath

58

Pour convertir un fichier XML en JSON, incluez la dépendance suivante

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

et vous pouvez télécharger Jar à partir du référentiel Maven ici . Puis implémentez comme:

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

5
+ pour les dépendances
maven

2
utilisez la version de json mentionnée dans l'article si vous êtes sur java 7 car la dernière version génère des erreurs étranges.
urug

Si vous avez un fichier dtd valide pour l'extrait de code xml, vous pouvez facilement convertir xml en json et json en xml à l'aide du fichier jar de lien open source eclipse. Un exemple détaillé de projet JAVA peut être trouvé ici: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia

J'ai dû copier l'intégralité du package JSON dans mon projet et renommé le package. L'ajout à gradle donne un avertissement de package en double d'Android pendant la construction.
codelearner

28

Le seul problème avec JSON en Java est que si votre XML a un seul enfant, mais est un tableau, il le convertira en objet au lieu d'un tableau. Cela peut poser des problèmes si vous effectuez toujours une conversion dynamique de XML en JSON, où si votre exemple de XML n'a qu'un seul élément, vous retournez un objet, mais s'il en a 2+, vous retournez un tableau, ce qui peut entraîner des problèmes d'analyse pour les personnes utilisant le JSON.

La classe XML2JSON d' Infoscoop a un moyen de baliser les éléments qui sont des tableaux avant d'effectuer la conversion, afin que les tableaux puissent être correctement mappés, même s'il n'y a qu'un seul enfant dans le XML.

Voici un exemple d'utilisation (dans un langage légèrement différent, mais vous pouvez également voir comment les tableaux sont utilisés à partir de la méthode nodelist2json () du lien XML2JSON).


nous utilisons une bibliothèque "xml-to-json" en python et c'est un problème sémantique. Ce que nous faisons pour résoudre ce problème de "tableau ou objet", c'est écrire une méthode "tryConvertToArray ()", qui retourne un tableau avec un seul objet. Ainsi, vous pouvez toujours faire confiance à votre valeur pour être un tableau
kommradHomer

Je ne vois pas clairement comment cela résout le problème. Faites-vous simplement tout un tableau au lieu d'un objet alors? Par exemple, si j'ai le XML <results><result><value>1</value></result></results>, cela générerait-il { "results" : { "result" : { "value" : "1" } } } ou { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus

Il y a quelque chose dont nous nous attendons à ce que ce soit un tableau. Le problème survient lorsque ce tableau n'a qu'un seul élément, ce qui en fait un objet pour le convertisseur xml-to-json. Donc, comme nous nous attendons à ce que ce soit un tableau même pour un seul élément, nous le vérifions et le convertissons en un tableau, en nous assurant que nous avons un tableau où nous attendons un tableau.
kommradHomer

Mais comment vous attendez-vous à ce qu'un élément spécifique soit un tableau? XML2JSON balise les éléments. Il n'est pas clair comment s'attendre à ce que ce soit un tableau sans le baliser, sinon vous ne le sauriez jamais avec un seul élément 'tableau'.
Marcus

Par exemple, il existe un élément appelé «numéros de téléphone». Et il y a un ou plusieurs éléments "phonenumber" dans l'élément "phonenumbers". Ainsi, quand il n'y a qu'un seul élément "phonenumber" dans "phonenumbers", xml2json crée un objet phonenumber, mais je crée un tableau de phonenumber et y mets l'objet phonenumber.
kommradHomer


2

J'ai trouvé cela de la manière rapide et facile: utilisé: org.json.XMLclasse de 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

Je ne sais pas quel est votre problème exact, mais si vous recevez du XML et que vous souhaitez renvoyer JSON (ou quelque chose), vous pouvez également consulter JAX-B. Il s'agit d'un standard pour le marshalling / unmarshalling Java POJO en XML et / ou Json. Il existe plusieurs bibliothèques qui implémentent JAX-B, par exemple le CXF d'Apache.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.