Decodificar uma resposta JSON OkHttp
1. Introdução
Neste tutorial, vamos explorar várias técnicas para decodificar uma resposta JSON ao usarOkHttp.
2. OkHttpResponse
O OkHttp é um cliente HTTP para Java e Android com recursos como manipulação transparente de GZIP, cache de resposta e recuperação de problemas de rede.
Apesar desses ótimos recursos, OkHttp não tem um codificador / decodificador integrado para JSON, XML e outros tipos de conteúdo. No entanto, podemos implementá-los com a ajuda de bibliotecas de vinculação XML / JSON ou podemos usar bibliotecas de alto nível comoFeign ouRetrofit.
Para implementar nosso decodificador JSON, precisamos extrair o JSON do resultado da chamada de serviço. Para isso, podemos acessar o corpo através do métodobody() do objetothe Response. A classeResponseBody tem várias opções para extrair esses dados:
-
byteStream(): expõe os bytes brutos do corpo como umInputStream; podemos usar isso para todos os formatos, mas geralmente é usado para binários e arquivos __
-
charStream(): quando temos uma resposta de texto,charStream() envolve seuInputStream emReader e lida com a codificação de acordo com o tipo de conteúdo da resposta ou “UTF-8” se charset isn é definido no cabeçalho da resposta; no entanto, ao usarcharStream(), não podemos alterar a codificação deReader
-
string(): retorna todo o corpo da resposta como umString; gerencia a codificação da mesma forma quecharStream(), mas se precisarmos de uma codificação diferente, podemos usarsource().readString(charset)
Neste artigo, vamos usarstring(), pois nossa resposta é pequena e não temos problemas de memória ou desempenho. Os métodosbyteStream()echarStream() são melhores escolhas em sistemas de produção quando o desempenho e a memória são importantes.
Para começar, vamos adicionarokhttp ao nosso arquivo pom.xml:
com.squareup.okhttp3
okhttp
3.14.2
E então, modelamos oSimpleEntity para testar nossos decodificadores:
public class SimpleEntity {
protected String name;
public SimpleEntity(String name) {
this.name = name;
}
// no-arg constructor, getters, and setters
}
Agora, vamos iniciar nosso teste:
SimpleEntity sampleResponse = new SimpleEntity("example");
OkHttpClient client = // build an instance;
MockWebServer server = // build an instance;
Request request = new Request.Builder().url(server.url("...")).build();
3. Decodifique oResponseBody com Jackson
Jackson é uma das bibliotecas mais populares para vinculação JSON-Object.
Vamos adicionarjackson-databind ao nosso pom.xml:
com.fasterxml.jackson.core
jackson-databind
2.9.9
ObjectMapper de Jackson nos permite converter JSON em um objeto. Assim, podemos decodificar a resposta usandoObjectMapper.readValue():
ObjectMapper objectMapper = new ObjectMapper();
ResponseBody responseBody = client.newCall(request).execute().body();
SimpleEntity entity = objectMapper.readValue(responseBody.string(), SimpleEntity.class);
Assert.assertNotNull(entity);
Assert.assertEquals(sampleResponse.getName(), entity.getName());
4. Decodifique oResponseBody com Gson
Gson é outra biblioteca útil para mapear JSON para objetos e vice-versa.
Vamos adicionargson ao nosso arquivo pom.xml:
com.google.code.gson
gson
2.8.5
Vamos ver como podemos usarGson.fromJson() para decodificar o corpo da resposta:
Gson gson = new Gson();
ResponseBody responseBody = client.newCall(request).execute().body();
SimpleEntity entity = gson.fromJson(responseBody.string(), SimpleEntity.class);
Assert.assertNotNull(entity);
Assert.assertEquals(sampleResponse.getName(), entity.getName());
5. Conclusão
Neste artigo, exploramos várias maneiras de decodificar a resposta JSON de OkHttp com Jackson e Gson.
A amostra completa está disponível emover on GitHub.