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?

BeachRunnerFred
la source
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"
}}
Danieltalsky
la source
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);
Kishan Bheemajiyani
la source
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).

Marcus
la source
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());
}
horizon7
la source
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.

Martin Sturm
la source