Decodificar uma resposta JSON OkHttp

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.