Mostrando postagens com marcador json. Mostrar todas as postagens
Mostrando postagens com marcador json. Mostrar todas as postagens

terça-feira, 17 de janeiro de 2017

Fácil conversão de JSON usando JSON-B

Há uns meses atrás postamos sobre o JSON-P e no final daquela postagem falamos sobre o JSON-B. Hoje vamos falar o básico sobre essa nova API Java para lidar com JSON e, o melhor de tudo, ela virou um padrão e será parte do Java 8.

Como adicicionar JSON-B à sua aplicação


No momento da escrita desse artigo o JSON-B está em beta e para usar o mesmo precisamos configurar o repositório maven onde está localizado o JSON-B..

Ao configurar o JSON-B, precisamos conhecer 3 principais classes:


  • javax.json.bind.JsonbConfig: Configura aspectos gerais do parsing de json permitindo configurar a forma que o Json será criado; 
  • javax.json.bind.JsonbBuilder: Cria objetos Jsonb;
  • javax.json.bindJsonb: O ponto de entrada para a realização do parsing.

Usando JSON-B



Usar JSON-B é muito simples e a ideia é transformar uma representação em JSON em um objeto Java. Então, seja o seguinte JSON:

{
"id": 10,
"nome": "William",
"idade": 28
}

Isso se traduziria para a classe pessoa (que você pode ver um pouco mais abaixo), que deve ser o padrão Java Bean. Para usar o Jsonb, simplesmente passamos a fonte do conteúdo JSON, que pode ser um inputstream (que é fechado automaticamente após o jsonb ler o mesmo), um Reader ou até mesmo uma String com o JSON. Ou seja, digamos que o JSON acima está em um arquivo chamado pessoa.json e queremos transformar ele em pessoa, poderíamos usar as seguintes linhas de código:

Jsonb jsonb = JsonbBuilder.create();
InputStream arquivoPessoa = TestesJSONB.class.getResourceAsStream("/pessoa.json");
Pessoa pessoa = jsonb.fromJson(arquivoPessoa, Pessoa.class);

Sim, 3 linhas e lemos o arquivo para um objeto Java. O caminho contrário seria ainda mais simples:

pessoa = new Pessoa(20, "Antônio", 1);
String json = jsonb.toJson(pessoa);

Isso resultaria no seguinte JSON:

{"id":20,"idade":1,"nome":"Antônio"} 

Veja que bacana. para imprimir um JSON formatado, simplesmente usamos o JsonbConfig:

JsonbConfig conf = new JsonbConfig();
conf.withFormatting(true);
jsonb = JsonbBuilder.create(conf);
pessoa = new Pessoa(20, "Antônio", 1);
String json = jsonb.toJson(pessoa);

Isso resulta em:

{
    "id":20,
    "idade":1,
    "nome":"Antônio"
}

Agora temos a parte mais "complicada", que é quando temos que transformar listas JSON. Para isso, precisamos do tipo generico da lista. Então, seja o seguinte conteúdo do arquivo pessoas.json:

[
{"id":10,"idade":28,"nome":"William"},
{"id":20,"idade":1,"nome":"Antônio"}
]

Para transformar para a lista, precisamos do tipo, o tipo é meio chato de pegar, mas segue como funciona localmente.

Type LISTA_PESSOA_TIPO = new ArrayList<Pessoa>() {}.getClass().getGenericSuperclass();
InputStream arquivoPessoas = TestesJSONB.class.getResourceAsStream("/pessoas.json");
List<Pessoa> pessoas = jsonb.fromJson(arquivoPessoas, LISTA_PESSOA_TIPO);
System.out.println(pessoas);


Essa parte ainda ficou um pouco emboladinha, mas podemos esperar melhorias, pois o JSON-B ainda é beta.

Veja o código usado hoje abaixo e o projeto completo no nosso github.


domingo, 21 de fevereiro de 2016

Convertendo objetos Java para JSON usando JSON-P

Falamos aqui na outra postagem sobre JAXB, a biblioteca padrão do Java para conversão de objetos para XML e vice versa. Hoje vamos falar sobre a conversão para JSON(um formato de dados famoso) usando JSON Processing.

JSON Explanation
Para um exemplo sobre uso de JSON com Android, veja esse artigo

API padrão do Java para JSON


O Java, por muitos anos, não tinha um padrão para a conversão de JSON, isso mudou com a JSR 353, que nos trouxe o JSON-P (JSON Processing).
Nessa especificação temos uma nova API para realizar transformação de JSON que é baseada em manipular a estrutura do JSON usando Java. Ou seja, não é uma API de binding, como mostrados para XML(onde podemos fazer a correspondência de um objeto Java para JSON ! Para isso temos a JSON-B(JSON binding), que ainda está em discussão e fará parte do Java EE 8, por enquanto podemos usar a API Jackson.

A API JSON Processing

Para utilizarmos JSON-P, temos que conhecer algumas classes importantes. Veja a tabela traduzida dessa página:

Principais classes e interfaces do pacote javax.json
Classe ou InterfaceDescrição
Json
Contém métodos especifícicos para criar instâncias de parsers JSON, builders e fábricas para criar objetos.
JsonReader
Lê JSON de um Stream e cria objetos de modelo em memória. (objetos de modelo que representam o JSON)
JsonObjectBuilder
JsonArrayBuilder
Cria um modelo de objeto ou um modelo de array na memória adicionando elementos da aplicação.
JsonWriter
Escreve um objeto da memória para um Stream.
JsonValue
Representa um elemento (como um objeto, um array ou um valor) em dados no formato JSON.
JsonStructure
Representa um objeto ou um array no formato JSON. É um subtipo do JsonValue.
JsonObject
JsonArray
Representa um objeto ou um array no tipo JSON.Essas interfaces são subtipos de JsonStructure.
JsonString
JsonNumber
Representam tipos de dados em JSON. Essas interfaces são subtipos de  JsonValue.
JsonException
Indicate que houve um error no processamento do JSON.

Principais classes e interfaces do pacto javax.json.stream
Classe ou interfaceDescrição
JsonParser
Representa um parser baseado em JSON que pode ler dados JSON de um Stream ou de um objeto de modelo.
JsonGenerator
Escreve JSON para um Stream, um elemento por vez.




Se você leu ali em cima,vamos ao código para "digerir" a informação.

Uma aplicação de exemplo


Vamos utilizar o mesmo objeto do post passado, o Artigo. Como iremos usar maven, precisamos adicionar a API e a implementação. Abaixo você pode ver o código Java e o JSON usado. O método javaParaJson gera o JSON a partir de uma lista de artigos e o mesmo JSON gerado será lido no métódo jsonParaJava devidamente comentados.


Conclusão


Apresentamos JSON-P e falamos da conversão JSON para Java e vice versa. Embora Java ainda não tenha uma forma nativa de lidar com JSON, a API JSON-P é simples de ser usada e a nova API JSON-B promete a mesma facilidade do JAXB para JSON.

O projeto maven usado nessa postagem está on github!