Maneira mais rápida de converter XML para JSON em Java [fechado]

171

Quais são algumas boas ferramentas para a conversão rápida e fácil de XML para JSON em Java?

BeachRunnerFred
fonte
Não posso usar XML diretamente devido a um requisito na especificação, mas concordo com você. obrigado!
BeachRunnerFred
@BeachRunnerJoe: Que importação eu preciso escrever? import net.sf.json.JSONObject;ou import org.json.JSONObject;. Também qual jar eu preciso incluir?
Fahim Parkar
1
Aqui está um link para uma maneira de fazê-lo sem quaisquer dependências, usando JAXP: stackoverflow.com/questions/27222992/...
bvdb
16
Eu amo as perguntas fechadas da SO que têm uma visibilidade tão alta ... Algo deu errado em algum lugar se uma pergunta tão útil foi encerrada.
Dariusz
2
eu acho que 90% dos mais perguntas úteis são "Closed-off topic" .. SMH
Jeryl Cozinhe

Respostas:

188

JSON em Java possui ótimos recursos.

Dependência do Maven:

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

XML.java é a classe que você está procurando:

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

A saída é:

{"test": {
    "attrib": "moretest",
    "content": "Turn this to JSON"
}}
danieltalsky
fonte
14
Aviso: O pacote json.org.XML não existe no Android!
precisa
2
@danieltalsky: Que importação eu preciso escrever? import net.sf.json.JSONObject;ou import org.json.JSONObject;. Também qual jar eu preciso incluir?
Fahim Parkar
2
faça o download de todos os arquivos, não apenas do XML.java. A partir daqui: github.com/douglascrockford/JSON-java/downloads
Spiff
4
E se você tiver um <test attrib="moretest" content="foo">bar</test>?
wchargin
1
NOTA: O XML.toJSONObject () do org.json também converte corretamente as listas xml em matrizes json (ao contrário do XmlMapper de jackson, que por padrão é engolido silenciosamente).
Agoston Horvath
58

Para converter o arquivo XML em JSON, inclua a seguinte dependência

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

e você pode fazer o download do Jar no repositório Maven aqui . Em seguida, implemente como:

String soapmessageString = "<xml>yourStringURLorFILE</xml>";
JSONObject soapDatainJsonObject = XML.toJSONObject(soapmessageString);
System.out.println(soapDatainJsonObject);
Kishan Bheemajiyani
fonte
5
+ para dependência maven fornecida
zacheusz
2
use a versão do json mencionada no post se você estiver no java 7, pois a versão mais recente gera erros estranhos.
urug
Se você tiver um arquivo dtd válido para o snippet xml, poderá converter facilmente xml em json e json em xml usando o jar de link de eclipse de código aberto. Projeto JAVA amostra detalhada pode ser encontrada aqui: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia
Eu tive que copiar o pacote JSON inteiro para o meu projeto e renomeei o pacote. Adicionar ao gradle avisa sobre o pacote duplicado do Android durante a compilação.
Codelearner
28

O único problema com JSON em Java é que, se seu XML tiver um único filho, mas for uma matriz, ele será convertido em um objeto, em vez de uma matriz. Isso pode causar problemas se você sempre converter dinamicamente de XML para JSON, onde se seu exemplo de XML tiver apenas um elemento, você retornará um objeto, mas se tiver mais de 2, retornará uma matriz, o que pode causar problemas de análise para as pessoas que usam o método JSON.

A classe XML2JSON da Infoscoop tem uma maneira de marcar elementos que são matrizes antes de fazer a conversão, para que as matrizes possam ser mapeadas corretamente, mesmo se houver apenas um filho no XML.

Aqui está um exemplo de uso (em uma linguagem um pouco diferente, mas você também pode ver como as matrizes são usadas no método nodelist2json () do link XML2JSON).

Marcus
fonte
estamos usando uma biblioteca "xml-to-json" em python e esse é um problema semântico. O que fazemos para resolver esse problema de "matriz ou objeto" é escrever um método "tryConvertToArray ()", que retorna uma matriz com o único objeto. Assim, você pode sempre confiar em seu valor a ser um array
kommradHomer
Não está claro para mim como isso resolve o problema. Você transforma tudo em uma matriz em vez de um objeto? Por exemplo, se eu tiver a XML <results><result><value>1</value></result></results>, seria gerar { "results" : { "result" : { "value" : "1" } } } ou { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus
Há algo que esperamos que seja uma matriz. O problema surge quando essa matriz possui apenas 1 elemento, tornando-a um objeto para o conversor de xml para json. Portanto, como esperamos que seja uma matriz para um único elemento, verificamos e convertemos em uma matriz, garantindo que tenhamos uma matriz na qual esperamos uma matriz.
kommradHomer
Mas como você espera que um elemento específico seja uma matriz? XML2JSON marca os elementos. Não está claro como esperar que seja uma matriz sem marcá-la, pois caso contrário você nunca saberia com um único elemento 'matriz'.
Marcus
Por exemplo, existe um elemento chamado "phonenumbers". E há 1 ou mais elementos "número de telefone" no elemento "números de telefone". Portanto, quando existe apenas um elemento "phonenumber" em "phonenumbers", o xml2json cria um objeto de número de telefone, mas eu crio uma matriz de número de telefone e coloco o objeto de número de telefone nele.
kommradHomer
2

Achei isso da maneira mais rápida e fácil: Usado: org.json.XMLclass from 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
fonte
1

Não sei qual é o seu problema exato, mas se você estiver recebendo XML e quiser retornar JSON (ou algo assim), também poderá ver o JAX-B. Esse é um padrão para organizar / desmarcar Java POJO para XML e / ou Json. Existem várias bibliotecas que implementam o JAX-B, por exemplo, o CXF do Apache.

Martin Sturm
fonte