Método mais simples para converter Json em Xml

Tenho o serviço web em. net. quando recupero dados da base de dados, devolve o ficheiro JSON no Android Mobile. Como posso converter o arquivo JSON para XML ou texto.

Author: Larry Battle, 2011-07-19

4 answers

Para uma solução simples, eu recomendo Jackson , pois pode transformar arbitrariamente o complexo JSON em XML com apenas algumas linhas simples de código.

import org.codehaus.jackson.map.ObjectMapper;

import com.fasterxml.jackson.xml.XmlMapper;

public class Foo
{
  public String name;
  public Bar bar;

  public static void main(String[] args) throws Exception
  {
    // JSON input: {"name":"FOO","bar":{"id":42}}
    String jsonInput = "{\"name\":\"FOO\",\"bar\":{\"id\":42}}";

    ObjectMapper jsonMapper = new ObjectMapper();
    Foo foo = jsonMapper.readValue(jsonInput, Foo.class);

    XmlMapper xmlMapper = new XmlMapper();
    System.out.println(xmlMapper.writeValueAsString(foo));
    // <Foo xmlns=""><name>FOO</name><bar><id>42</id></bar></Foo>
  }
}

class Bar
{
  public int id;
}

Esta demonstração usa Jackson 1.7.7 (o mais recente 1.7.8 também deve funcionar), Jackson XML Databind 0.5.3 (ainda não compatível com Jackson 1.8), e Stax2 3.1.1.

 8
Author: Programmer Bruce, 2011-07-19 06:23:28

Aqui está um exemplo de como você pode fazer isso, gerando XML válido. Também uso a Biblioteca Jackson num projecto Maven.

Configuração Maven:

<!-- https://mvnrepository.com/artifact/com.fasterxml/jackson-xml-databind -->
    <dependency>
        <groupId>com.fasterxml</groupId>
        <artifactId>jackson-xml-databind</artifactId>
        <version>0.6.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.6</version>
    </dependency>

Aqui está um código Java que primeiro converte uma cadeia de caracteres JSON para um objecto e depois converte o objecto com o XMLMapper para XML e também remove quaisquer nomes de elementos errados. A razão para substituir caracteres errados em nomes de elementos XML é o fato de que você pode usar em nomes de elementos JSON como $oid com caracteres não permitidos em XML. A Biblioteca Jackson não conta com isso, então eu acabei adicionando algum código que remove caracteres ilegais de nomes de elementos e também as declarações de espaços de nomes.

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.xml.XmlMapper;

import java.io.IOException;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Converts JSON to XML and makes sure the resulting XML 
 * does not have invalid element names.
 */
public class JsonToXMLConverter {

    private static final Pattern XML_TAG =
            Pattern.compile("(?m)(?s)(?i)(?<first><(/)?)(?<nonXml>.+?)(?<last>(/)?>)");

    private static final Pattern REMOVE_ILLEGAL_CHARS = 
            Pattern.compile("(i?)([^\\s=\"'a-zA-Z0-9._-])|(xmlns=\"[^\"]*\")");

    private ObjectMapper mapper = new ObjectMapper();

    private XmlMapper xmlMapper = new XmlMapper();

    String convertToXml(Object obj) throws IOException {
        final String s = xmlMapper.writeValueAsString(obj);
        return removeIllegalXmlChars(s);
    }

    private String removeIllegalXmlChars(String s) {
        final Matcher matcher = XML_TAG.matcher(s);
        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            String elementName = REMOVE_ILLEGAL_CHARS.matcher(matcher.group("nonXml"))
                    .replaceAll("").trim();
            matcher.appendReplacement(sb, "${first}" + elementName + "${last}");
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    Map<String, Object> convertJson(String json) throws IOException {
        return mapper.readValue(json, new TypeReference<Map<String, Object>>(){});
    }

    public String convertJsonToXml(String json) throws IOException {
        return convertToXml(convertJson(json));
    }
}

Aqui está um teste conjunto para convertJsonToXml:

@Test
void convertJsonToXml() throws IOException, ParserConfigurationException, SAXException {
    try(InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("json/customer_sample.json")) {
        String json = new Scanner(in).useDelimiter("\\Z").next();
        String xml = converter.convertJsonToXml(json);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
        Node first = doc.getFirstChild();
        assertNotNull(first);
        assertTrue(first.getChildNodes().getLength() > 0);
    }
}
 2
Author: gil.fernandes, 2017-01-30 15:42:46

Nenhuma API de conversão direta está disponível no android para converter JSON para XML. Você precisa analisar JSON primeiro, então você terá que escrever a lógica para convertê-lo em xml.

 1
Author: N-JOY, 2011-07-19 05:45:00

Standard org.json.A classe XML converte entre JSON e XML em ambas as direcções.

A conversão não é muito agradável, uma vez que não cria atributos XML (apenas entidades), por isso a saída XML é mais volumosa do que poderia ser. Mas não é necessário definir classes Java que correspondam às estruturas de dados que precisam ser convertidas.

 1
Author: h22, 2015-06-09 09:05:38