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.

  • ๐Ÿ—๏ธ Estrutura JSON: Os dados sรฃo armazenados como pares de chave e valor dentro de chaves, com vรญrgulas separando cada entrada.
  • ๐Ÿท๏ธ Estrutura XML: Os dados sรฃo armazenados em nรณs aninhados, onde cada tag de abertura requer uma tag de fechamento correspondente.
  • ๐Ÿ”— Modelo Compartilhado: Um conjunto de anotaรงรตes Java O formato `classes` serve como ponte, portanto nenhum dos formatos รฉ analisado diretamente no outro.
  • ๐Ÿ“ฅ Desempacotamento: JAXB lรช um arquivo XML e retorna uma lista preenchida. Java รกrvore de objetos atravรฉs da classe Unmarshaller.
  • ๐Ÿ“ค Escrita em fluxo contรญnuo: O Gson JsonWriter Emite JSON incrementalmente com chamadas beginObject, name, value e endObject.
  • ๐Ÿ”„ Reverse Caminho: O JsonReader reconstrรณi os objetos a partir do JSON, e o Marshaller JAXB os grava novamente como XML.
  • โš ๏ธ Nota de tempo de execuรงรฃo: JAXB deixou o JDK em Java 11, portanto, a dependรชncia jakarta.xml.bind deve ser adicionada explicitamente.

Converter JSON para XML em Java

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.

Crie um novo Java Projeto.

Passo 2) Defina o nome do projeto.
Defina o nome do projeto para XmlToJsonExemplo.

Definir nome do projeto

Passo 3) Crie uma pasta
Crie a pasta dados/entrada contendo os dois arquivos amostra.xml e amostra.json.

Criar dados de pasta

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.

Relacionamentos de objetos

<?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.

Definir classes de objetos

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.

Configurar biblioteca Gson

Adicione a biblioteca Gson 2.8.5 em Java Caminho de construรงรฃo

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.

Definir aulas performรกticas

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.

Perguntas Frequentes

O JAXB foi removido do JDK em Java 11. Adicione a API jakarta.xml.bind juntamente com um ambiente de execuรงรฃo como o jaxb-runtime e atualize as importaรงรตes de javax para jakarta.

Nรฃo. O Gson sรณ lida com JSON. O XML precisa primeiro ser convertido em JSON. Java objetos por meio do JAXB, ou por meio de outro analisador como o Jackson XML, antes que o Gson possa serializรก-los.

XmlElement cria uma tag filha contendo o valor, enquanto XmlAttribute coloca o valor dentro da tag de abertura do elemento pai. Atributos nรฃo podem conter estruturas aninhadas.

O streaming mantรฉm o uso de memรณria baixo e permite que a estrutura de saรญda seja diferente das classes de entrada, que รฉ exatamente o que acontece quando as pessoas estรฃo aninhadas dentro de funรงรตes.

Sim, a partir de um documento XML de exemplo. Verifique as anotaรงรตes de encapsulamento nas coleรงรตes, pois as classes geradas frequentemente omitem o XmlElementWrapper e produzem uma estrutura plana.

O JSON e sua variante delimitada por linhas dominam, porque mapeiam diretamente para Python dicionรกrios e fluxos de dados eficientes. O XML ainda aparece onde sistemas empresariais legados fornecem os dados de origem.

Resuma esta postagem com: