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.


Um comentário:

  1. velho aqui um curso super barato e java EE vale muito apena dar uma olhada e verificar se vale a pena comprar ou não.
    https://go.hotmart.com/T5607085N

    ResponderExcluir