La forma más rápida de convertir XML a JSON en Java [cerrado]

171

¿Cuáles son algunas buenas herramientas para convertir rápida y fácilmente XML a JSON en Java?

BeachRunnerFred
fuente
No puedo usar XML directamente debido a un requisito en la especificación, pero estoy de acuerdo con usted. ¡Gracias!
BeachRunnerFred 01 de
@BeachRunnerJoe: ¿Qué importancia necesito escribir? import net.sf.json.JSONObject;o import org.json.JSONObject;. Además, ¿qué jar debo incluir?
Fahim Parkar
1
Aquí hay un enlace a una forma de hacerlo sin dependencias, usando JAXP: stackoverflow.com/questions/27222992/…
bvdb
16
Me encantan las preguntas cerradas de SO que tienen una visibilidad tan alta ... Algo salió mal en algún lugar si se cerró una pregunta tan útil.
Dariusz
2
Creo que el 90% de las preguntas más útiles son "Tema cerrado" .. smh
Jeryl Cook

Respuestas:

188

JSON en Java tiene algunos recursos excelentes.

Dependencia de Maven:

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

XML.java es la clase que estás buscando:

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

Salida es:

{"test": {
    "attrib": "moretest",
    "content": "Turn this to JSON"
}}
danieltalsky
fuente
14
Advertencia: ¡El paquete json.org.XML no existe en Android!
Ludovic Landry
2
@danieltalsky: ¿Qué importancia necesito escribir? import net.sf.json.JSONObject;o import org.json.JSONObject;. Además, ¿qué jar debo incluir?
Fahim Parkar
2
descargue todos los archivos, no solo XML.java. Desde aquí: github.com/douglascrockford/JSON-java/downloads
Spiff
44
¿Qué pasa si tienes un <test attrib="moretest" content="foo">bar</test>?
wchargin
1
NOTA: org.json XML.toJSONObject () también convierte correctamente las listas xml en matrices json (a diferencia del jackson XmlMapper que, de forma predeterminada, se traga silenciosamente).
Agoston Horvath
58

Para convertir un archivo XML a JSON, incluya la siguiente dependencia

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

y puedes descargar Jar del repositorio de Maven aquí . Luego implemente como:

String soapmessageString = "<xml>yourStringURLorFILE</xml>";
JSONObject soapDatainJsonObject = XML.toJSONObject(soapmessageString);
System.out.println(soapDatainJsonObject);
Kishan Bheemajiyani
fuente
55
+ para la dependencia de
Maven
2
use la versión de json mencionada en la publicación si está en java 7 ya que la última versión arroja errores extraños.
urug
Si tiene un archivo dtd válido para el fragmento de código xml, puede convertir fácilmente xml a json y json a xml utilizando el jar de enlace de eclipse de código abierto. Puede encontrar un ejemplo detallado del proyecto JAVA aquí: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia
Tuve que copiar todo el paquete JSON a mi proyecto y renombrar el paquete. Agregar a gradle da advertencia de paquete duplicado de Android durante la compilación.
codelearner
28

El único problema con JSON en Java es que si su XML tiene un solo hijo, pero es una matriz, lo convertirá en un objeto en lugar de una matriz. Esto puede causar problemas si siempre convierte dinámicamente de XML a JSON, donde si su XML de ejemplo solo tiene un elemento, devuelve un objeto, pero si tiene 2+, devuelve una matriz, lo que puede causar problemas de análisis para las personas que usan JSON

La clase XML2JSON de Infoscoop tiene una forma de etiquetar elementos que son matrices antes de realizar la conversión, de modo que las matrices se pueden asignar correctamente, incluso si solo hay un hijo en el XML.

Aquí hay un ejemplo de su uso (en un lenguaje ligeramente diferente, pero también puede ver cómo se usan las matrices desde el método nodelist2json () del enlace XML2JSON).

Marcus
fuente
estamos usando una biblioteca "xml-to-json" en python y este es un problema semántico. Lo que hacemos para resolver este problema de "matriz u objeto" es escribir un método "tryConvertToArray ()", que devuelve una matriz con el único objeto. Por lo tanto, siempre puede confiar en que su valor sea una matriz
kommradHomer
No me queda claro cómo eso resuelve el problema. ¿Simplemente haces que todo sea una matriz en lugar de un objeto entonces? Por ejemplo, si tengo el XML <results><result><value>1</value></result></results>, ¿generaría { "results" : { "result" : { "value" : "1" } } } o { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus
Hay algo que esperamos que sea una matriz. El problema surge cuando esta matriz tiene solo 1 elemento, por lo que es un objeto para el convertidor de xml a json. Entonces, como esperamos que sea una matriz incluso para un solo elemento, la verificamos y la convertimos en una matriz, asegurándonos de tener una matriz donde esperamos una matriz.
kommradHomer
Pero, ¿cómo espera que un elemento específico sea una matriz? XML2JSON etiqueta los elementos. No está claro cómo esperar que sea una matriz sin etiquetarla, ya que de lo contrario nunca se sabría con un solo elemento 'matriz'.
Marcus
Por ejemplo, hay un elemento llamado "números de teléfono". Y hay 1 o más elementos de "número de teléfono" en el elemento de "número de teléfono". Entonces, cuando solo hay un elemento de "número de teléfono" en "números de teléfono", xml2json crea un objeto de número de teléfono, pero yo creo una matriz de número de teléfono y pongo el objeto de número de teléfono en él.
kommradHomer
2

Encontré esto de la manera rápida y fácil: Usado: org.json.XMLclase 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
fuente
1

No sé cuál es su problema exacto, pero si está recibiendo XML y desea devolver JSON (o algo así) también podría mirar JAX-B. Este es un estándar para ordenar / desmantelar POJO de Java a XML y / o Json. Existen múltiples bibliotecas que implementan JAX-B, por ejemplo, CXF de Apache.

Martin Sturm
fuente