Converter JSON em XML Java usando Gson e JAXB
โก Resumo Inteligente
Converter JSON em XML Java usando Gson e JAXB por mapaping ambos os formatos na mesma anotaรงรฃo Java Este artigo define cada formato, configura o projeto, descompacta XML com JAXB, escreve JSON com Gson e reverte todo o processo.

O que รฉ JSON?
JSON รฉ uma abreviaรงรฃo de JavaA Notaรงรฃo de Objetos de Script (Script Object Notation - JSON) รฉ um formato de dados que segue regras que a maioria das linguagens de programaรงรฃo consegue ler. Podemos salvรก-la facilmente em um arquivo ou armazenรก-la em um banco de dados. O formato JSON utiliza pares de chave-valor para descrever os dados.
No exemplo a seguir, definimos uma string JSON que armazena informaรงรตes pessoais:
{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}
A sintaxe do JSON รฉ muito simples. Cada item de dados possui duas partes: uma chave e um valor, que correspondem ao nome do campo e ao seu valor em um registro. Analisando mais a fundo, existem algumas regras como esta:
- A string JSON รฉ colocada entre chaves {}.
- As chaves do JSON devem estar entre aspas duplas, e os valores de string tambรฉm devem ser colocados entre aspas.
- Se houver mais dados (mais pares chave => valor), usamos vรญrgulas (,) para separรก-los.
- As chaves JSON devem usar letras, nรบmeros ou o caractere de sublinhado, sem espaรงos, e o primeiro caractere nรฃo deve ser um nรบmero.
O que รฉ XML?
XML significa Linguagem de Marcaรงรฃo Extensรญvel, proposta pelo Consรณrcio World Wide Web (https://www.w3.org/) para criar outras linguagens de marcaรงรฃo. Este รฉ um subconjunto simples que pode descrever muitos tipos diferentes de dados, sendo muito รบtil para compartilhar dados entre sistemas.
As tags em XML geralmente nรฃo sรฃo predefinidas, mas sรฃo criadas de acordo com as convenรงรตes do usuรกrio. XML introduz novos recursos baseados nas vantagens do HTML.
Existem algumas funcionalidades XML รบteis para diversos sistemas e soluรงรตes:
- XML รฉ extensรญvel: XML permite que vocรช crie suas prรณprias tags personalizadas para se adequar ร sua aplicaรงรฃo.
- O XML transporta dados, nรฃo os exibe: o XML permite armazenar dados independentemente de como eles serรฃo exibidos.
- XML รฉ um padrรฃo comum: XML foi desenvolvido pelo World Wide Web Consortium (W3C) e estรก disponรญvel como um padrรฃo aberto.
O XML รฉ construรญdo sobre uma estrutura de nรณs aninhados. Cada nรณ possui uma tag de abertura e uma tag de fechamento, conforme descrito a seguir:
<node>content</node>
No qual:
- ร uma tag aberta, e o nome dessa tag รฉ definido por vocรช.
- รฉ uma tag de fechamento, e o nome dessa tag deve corresponder ao nome da tag de abertura.
- o conteรบdo รฉ o conteรบdo desta tag.
No inรญcio de cada arquivo XML, vocรช deve declarar uma tag para indicar a versรฃo do XML em uso. A sintaxe da tag de instruรงรฃo รฉ a seguinte:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
JSON vs XML: Principais Diferenรงas
Ambos os formatos contรชm dados estruturados, e a tabela abaixo mostra por que um projeto pode precisar migrar entre eles.
| Parรขmetro | JSON | XML |
|---|---|---|
| Estilo de sintaxe | Pares de chave e valor | Etiquetas aninhadas |
| Tipos de dados | String, nรบmero, booleano, nulo, array, objeto | Somente texto, os tipos vรชm de um esquema |
| Atributos | Nรฃo suportado | Compatรญvel com qualquer elemento |
| Comentรกrios | Nรฃo suportado | Suportado |
| Verbosidade | Compact | Mais detalhado porque as tags se repetem. |
| Validaรงรฃo de esquema | Esquema JSON, opcional | DTD e XSD, maduros |
| Uso tรญpico | APIs da Web e configuraรงรฃo | Mensagens e documentos empresariais |
O que รฉ Gson?
Gson (https://github.com/google/gson) ร um Java biblioteca que permite aos usuรกrios converter um Java converter um objeto em uma string JSON e tambรฉm converter uma string JSON de volta para um objeto. Java objeto. Gson pode trabalhar com arbitrรกrios Java objetos, incluindo objetos existentes cujo cรณdigo-fonte vocรช nรฃo possui.
Desde a versรฃo 1.6, o Gson introduz duas classes, JsonReader e JsonWriter, para fornecer processamento de fluxo contรญnuo de dados JSON.
- JsonWriter โ Gravaรงรฃo em fluxo contรญnuo para JSON. Criamos um JsonWriter objeto. Para iniciar e finalizar a criaรงรฃo de um objeto JSON, utilizamos as funรงรตes. comeรงarObject() e fimObject()Entre essas duas chamadas, escrevemos os dados em pares (chave => valor).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
- JsonReader โ Leitura em fluxo contรญnuo de JSON. Criamos um objeto JsonReader. Para iniciar e finalizar a leitura de um objeto JSON, usamos as funรงรตes beginObject() e endObject(). Entre essas duas chamadas, lemos os dados em pares (chave => valor).
JsonReader reader = new JsonReader();
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("key")) {
String value = reader.nextString();
}
}
reader.endObject();
O processamento de fluxos de dados do Gson รฉ rรกpido. No entanto, vocรช precisa manipular cada par (chave => valor) dos dados JSON manualmente.
O que รฉ JAXB?
JAXB significa Java Archiarquitetura para XML Binding, que รฉ uma biblioteca que usa anotaรงรตes para converter Java objetos para conteรบdo XML e vice-versa. Como o JAXB รฉ definido por uma especificaรงรฃo, podemos usar diferentes implementaรงรตes desse padrรฃo.
Com o JAXB, costumamos usar as seguintes anotaรงรตes bรกsicas:
- @XmlRootElementEsta anotaรงรฃo especifica a tag mais externa do arquivo XML e, portanto, รฉ declarada acima de uma classe.
- @XmlElementWrapper: esta anotaรงรฃo cria um elemento XML wrapper em torno das coleรงรตes.
- @XmlElementEsta anotaรงรฃo declara que uma propriedade do objeto se torna uma tag filha do arquivo XML.
- @XmlAttributeEsta anotaรงรฃo declara que uma propriedade do objeto se torna um atributo da tag que a envolve.
A implementaรงรฃo geral รฉ a seguinte. Primeiro, inicializamos o Contexto JAXB objeto com o Meuobjeto classe a ser convertida.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
Este Contexto JAXB O objeto possui um mรฉtodo que cria um objeto que converte conteรบdo XML em um Java objeto, o Desempacotador.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
O mesmo Contexto JAXB O objeto tambรฉm possui um mรฉtodo que cria o objeto que converte um Java objeto em conteรบdo XML, o Marechal.
Marshaller marshallerObj = jaxbContext.createMarshaller();
โ ๏ธ Aviso: O JAXB foi removido do JDK em Java 11. Em Java A partir da versรฃo 11, adicione explicitamente a API e uma implementaรงรฃo de tempo de execuรงรฃo ao projeto, por exemplo. jakarta.xml.bind:jakarta.xml.bind-api Juntamente com org.glassfish.jaxb:jaxb-runtimee importe as anotaรงรตes de jakarta.xml.bind.annotation em vez de javax.xml.bind.annotation.
Como converter XML para JSON?
Implementamos o exemplo de conversรฃo de XML para JSON na seguinte plataforma. As versรตes abaixo sรฃo as utilizadas nas capturas de tela. Versรตes mais recentes do JDK, Eclipse, e o Gson funcionam da mesma maneira, sujeitos ร observaรงรฃo do JAXB acima.
- OpenJDK 8 para Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Java Desenvolvimento para Ubuntu.
- Gson 2.8.5.
Passo 1) Criar projeto.
Crie um novo Java projeto.
Passo 2) Defina o nome do projeto.
Defina o nome do projeto para XmlToJsonExemplo.
Passo 3) Crie uma pasta
Crie a pasta dados/entrada contendo os dois arquivos amostra.xml e amostra.json.
Vamos primeiro definir nosso XML com departamento, papel e pessoa propriedades.
A arquitetura geral รฉ a seguinte: um departamento tem vรกrias funรงรตes, e uma funรงรฃo tem vรกrias pessoas. O diagrama abaixo mostra essas relaรงรตes.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root> <department> <roles> <role id="1"> <position>head</position> <salary>10k</salary> </role> <role id="2"> <position>manager</position> <salary>8k</salary> </role> <role id="3"> <position>employee</position> <salary>5k</salary> </role> </roles> <persons> <person id="1"> <name>Red</name> <role>1</role> </person> <person id="2"> <name>Green</name> <role>2</role> </person> <person id="3"> <name>Blue</name> <role>2</role> </person> <person id="4"> <name>Yellow</name> <role>3</role> </person> <person id="5"> <name>Brown</name> <role>3</role> </person> </persons> </department> </root>
Em segundo lugar, definimos o JSON que expressa a mesma ideia. Observe que a lista simples de pessoas se transforma em um array aninhado dentro de cada funรงรฃo, que รฉ exatamente a transformaรงรฃo realizada pelo cรณdigo de conversรฃo.
{
"roles": [
{
"id": "1",
"position": "head",
"salary": "10k",
"persons": [
{
"id": "1",
"name": "Red"
}
]
},
{
"id": "2",
"position": "manager",
"salary": "8k",
"persons": [
{
"id": "2",
"name": "Green"
},
{
"id": "3",
"name": "Blue"
}
]
},
{
"id": "3",
"position": "employee",
"salary": "5k",
"persons": [
{
"id": "4",
"name": "Yellow"
},
{
"id": "5",
"name": "Brown"
}
]
}
]
}
Passo 4) Defina objetos.
Defina as classes de objetos correspondentes no pacote. modelo.
Role.java
@XmlRootElement(name = "role") public class Role { private String id; private String position; private String salary; public Role() { super(); } public Role(String id, String position, String salary) { super(); this.id = id; this.position = position; this.salary = salary; } @XmlAttribute(name = "id") public String getId() { return id; } public void setId(String id) { this.id = id; } @XmlElement(name = "position") public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } @XmlElement(name = "salary") public String getSalary() { return salary; } public void setSalary(String salary) { this.salary = salary; } }
Person.java
@XmlRootElement(name = "person") public class Person { private String id; private String name; private String role; public Person() { super(); } public Person(String id, String name, String role) { super(); this.id = id; this.name = name; this.role = role; } @XmlAttribute(name = "id") public String getId() { return id; } public void setId(String id) { this.id = id; } @XmlElement(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement(name = "role") public String getRole() { return role; } public void setRole(String role) { this.role = role; } }
Departamento.java
@XmlRootElement(name = "department") public class Department { private List<Role> roles; private List<Person> persons; public Department() { super(); } public Department(List<Role> roles, List<Person> persons) { super(); this.roles = roles; this.persons = persons; } @XmlElementWrapper(name = "roles") @XmlElement(name = "role") public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } @XmlElementWrapper(name = "persons") @XmlElement(name = "person") public List<Person> getPersons() { return persons; } public void setPersons(List<Person> persons) { this.persons = persons; } }
XMLModel.java
@XmlRootElement(name = "root") public class XMLModel { private Department department; public XMLModel() { super(); } public XMLModel(Department department) { super(); this.department = department; } @XmlElement(name = "department") public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
Passo 5) Configure a biblioteca.
Adicione e configure a biblioteca Gson 2.8.5 no Java Construir caminho.
Se o projeto usar Maven Em vez de um arquivo JAR adicionado manualmente, as mesmas bibliotecas sรฃo declaradas como dependรชncias. A versรฃo 2.8.5 estรก fixada aqui para corresponder ร s capturas de tela, e qualquer versรฃo posterior do Gson funciona de forma idรชntica para este exemplo:
<dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> <!-- required on Java 11 and later --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> </dependency> </dependencies>
Converter mensagem XML em Java objetos usando JAXB
Primeiramente, definimos as classes de execuรงรฃo no pacote. serviรงo.
Na primeira etapa do primeiro processo, utilizamos a tรฉcnica de desempacotamento do JAXB.
A desserializaรงรฃo permite que um aplicativo cliente converta dados XML em dados derivados do JAXB. Java objetos.
Definimos a funรงรฃo getObjectFromXmlFile para desserializar nosso arquivo XML de volta para um Java objeto. Esta funรงรฃo รฉ definida na classe Serviรงo XML.
public XMLModel getObjectFromXmlFile(String filePath) { try { File file = new File(filePath); JAXBContext jaxbContext = JAXBContext.newInstance(XMLModel.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); XMLModel root = (XMLModel) jaxbUnmarshaller.unmarshal(file); return root; } catch (JAXBException e) { e.printStackTrace(); return null; } }
Chamamos o cรณdigo acima na classe XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
Neste ponto, o arquivo XML tornou-se trรชs Java objetos na memรณria. O prรณximo passo os grava como JSON.
Converter Java objetos para mensagem JSON usando Gson
Nesta etapa, definimos a funรงรฃo. writeDataToJsonFile Para escrever dados no arquivo JSON. Esta funรงรฃo estรก definida na classe. JsonService.
Observe que, para escrever uma lista de objetos JSON, usamos as funรงรตes. comeรงarArray() e fimArray()Entre essas duas chamadas, escrevemos cada objeto JSON.
public void writeDataToJsonFile(String filePath, List<Role> roles, List<Person> persons) { try { JsonWriter writer = new JsonWriter(new FileWriter(filePath)); writer.setIndent(" "); writer.beginObject(); writer.name("roles"); writer.beginArray(); for (Role role : roles) { writer.beginObject(); writer.name("id").value(role.getId()); writer.name("position").value(role.getPosition()); writer.name("salary").value(role.getSalary()); writer.name("persons"); writer.beginArray(); for (Person person : persons) { if (person.getRole().equalsIgnoreCase(role.getId())) { writer.beginObject(); writer.name("id").value(person.getId()); writer.name("name").value(person.getName()); writer.endObject(); } } writer.endArray(); writer.endObject(); } writer.endArray(); writer.endObject(); writer.close(); } catch (IOException e) { } }
Chamamos o cรณdigo acima na classe XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
Esse รฉ o primeiro processo. O loop interno compara cada pessoa com o ID da funรงรฃo atual, e รฉ assim que a lista de pessoas em XML se transforma em um array JSON aninhado.
Converter mensagem JSON em Java objetos usando Gson
Na primeira etapa do segundo processo, definimos a funรงรฃo. getDataFromJsonFile para ler dados do arquivo JSON. Esta funรงรฃo estรก definida na classe JsonService.
Observe que, para ler uma lista de objetos JSON, usamos as funรงรตes. comeรงarArray() e fimArray()Entre essas duas chamadas, lemos cada objeto JSON.
public void getDataFromJsonFile(String filePath, List<Role> roles, List<Person> persons) { try { JsonReader reader = new JsonReader(new FileReader(filePath)); reader.beginObject(); while (reader.hasNext()) { String nameRoot = reader.nextName(); if (nameRoot.equals("roles")) { reader.beginArray(); while (reader.hasNext()) { reader.beginObject(); Role role = new Role(); while (reader.hasNext()) { String nameRole = reader.nextName(); if (nameRole.equals("id")) { role.setId(reader.nextString()); } else if (nameRole.equals("position")) { role.setPosition(reader.nextString()); } else if (nameRole.equals("salary")) { role.setSalary(reader.nextString()); } else if (nameRole.equals("persons")) { reader.beginArray(); while (reader.hasNext()) { reader.beginObject(); Person person = new Person(); person.setRole(role.getId()); while (reader.hasNext()) { String namePerson = reader.nextName(); if (namePerson.equals("id")) { person.setId(reader.nextString()); } else if (namePerson.equals("name")) { person.setName(reader.nextString()); } } persons.add(person); reader.endObject(); } reader.endArray(); } } roles.add(role); reader.endObject(); } reader.endArray(); } } reader.endObject(); reader.close(); } catch (IOException e) { } }
Chamamos o cรณdigo acima na classe XmlToJsonService.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
Converter Java objetos para mensagem XML usando JAXB
Nesta etapa, utilizamos a tรฉcnica de serializaรงรฃo do JAXB.
O Marshalling fornece a um aplicativo cliente a capacidade de converter um objeto derivado de JAXB. Java รกrvore de objetos em dados XML.
Definimos a funรงรฃo parseObjectToXml para reunir o Java objeto para uma mensagem XML. Esta funรงรฃo รฉ definida na classe Serviรงo XML.
public void parseObjectToXml(String filePath, XMLModel xmlModel) { try { JAXBContext contextObj = JAXBContext.newInstance(XMLModel.class); Marshaller marshallerObj = contextObj.createMarshaller(); marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshallerObj.marshal(xmlModel, new FileOutputStream(filePath)); } catch (JAXBException je) { System.out.println("JAXBException"); } catch (IOException ie) { System.out.println("IOException"); } }
Chamamos o cรณdigo acima na classe XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = new XMLModel(); Department department = new Department(); department.setRoles(roles); department.setPersons(persons); xmlModel.setDepartment(department); xmlService.parseObjectToXml(filePathOut, xmlModel);
Esse รฉ o segundo processo. O arquivo gerado corresponde ao sample.xml original, o que confirma que a comunicaรงรฃo completa preservou todos os valores.
Como converter JSON para XML em Java Sem uma classe de modelo?
A abordagem acima รฉ a escolha certa quando a estrutura รฉ conhecida e estรกvel, porque as classes anotadas documentam a condiรงรฃo.tracQuando a estrutura รฉ desconhecida ou muda com frequรชncia, um conversor genรฉrico รฉ mais rรกpido.
O org.json A biblioteca realiza a conversรฃo em duas linhas, sem nenhuma classe de modelo:
import org.json.JSONObject; import org.json.XML; public class QuickConverter { public static void main(String[] args) { String str = "{\"username\":\"guru99user\",\"email\":\"guru99user@mail.com\"}"; JSONObject json = new JSONObject(str); String xml = XML.toString(json); System.out.println(xml); } }
Saรญda:
<username>guru99user</username><email>guru99user@mail.com</email>
Note que a rota genรฉrica nรฃo produz nenhum elemento raiz nem atributos, portanto XML.toString(json, "root") Normalmente รฉ necessรกrio. A tabela abaixo compara as duas abordagens lado a lado.
| Critรฉrio | Gson com JAXB | Conversรฃo genรฉrica de org.json |
|---|---|---|
| Classes modelo necessรกrias | Sim | Nรฃo |
| Controle sobre a estrutura | Completo, incluindo atributos | Limitado, apenas elementos |
| Reshaping dados, | Possรญvel, como demonstrado com pessoas aninhadas. | Nรฃo รฉ possivel |
| Linhas de cรณdigo | Muitos | Dois |
| Melhor para | Esquemas estรกveis โโe documentados | Estruturas ad hoc ou desconhecidas |
O JAXB lรช dados XML e o Gson os grava em JSON, e o caminho inverso usa o Gson para ler. JSON dados enquanto o JAXB os grava de volta em XML. Para saber mais, revise XML fundamentos, o mais amplo Java tutorial e Relatรณrios Jasper, que utiliza ambos os formatos como fontes de dados para relatรณrios.








