Рубрики
Без рубрики

Декодирование ответа OkHttp JSON

Изучите несколько методов декодирования Http-ответа JSON Ok

Автор оригинала: baeldung.

1. введение

В этом уроке мы рассмотрим несколько методов декодирования ответа JSON при использовании OkHttp .

2. Ответ ohttp

OkHttp-это HTTP-клиент для Java и Android с такими функциями, как прозрачная обработка GZIP, кэширование ответов и восстановление после сетевых проблем.

Несмотря на эти замечательные функции, OkHttp не имеет встроенного кодера/декодера для JSON, XML и других типов контента. Однако мы можем реализовать их с помощью библиотек привязки XML/JSON, или мы можем использовать библиотеки высокого уровня, такие как притворство или модернизация .

Чтобы реализовать наш декодер JSON, нам нужно извлечь JSON из результата вызова службы. Для этого мы можем получить доступ к телу с помощью метода body() объекта Response . Класс Тело ответа имеет несколько вариантов извлечения этих данных:

  • byteStream() : предоставляет необработанные байты тела в виде InputStream ; мы можем использовать это для всех форматов, но обычно это используется для двоичных файлов и файлов
  • CharStream() : когда у нас есть текстовый ответ, CharStream() обертывает его InputStream в Reader и обрабатывает кодировку в соответствии с типом содержимого ответа или “UTF-8”, если кодировка не задана в заголовке ответа; однако при использовании CharStream () мы не можем изменить кодировку Reader .
  • string() : возвращает все тело ответа в виде String ; управляет кодировкой так же , как char Stream () , но если нам нужна другая кодировка, мы можем использовать source().ReadString(charset) вместо этого

В этой статье мы будем использовать string () , так как наш ответ невелик, и у нас нет проблем с памятью или производительностью. Методы byte Stream() и CharStream() являются лучшим выбором в производственных системах, когда производительность и память имеют значение.

Для начала давайте добавим okhttp к вашему pom.xml файл:


    com.squareup.okhttp3
    okhttp 
    3.14.2 

А затем мы моделируем Простую сущность для тестирования наших декодеров:

public class SimpleEntity {
    protected String name;

    public SimpleEntity(String name) {
        this.name = name;
    }
    
    // no-arg constructor, getters, and setters
}

Теперь мы собираемся начать наш тест:

SimpleEntity sampleResponse = new SimpleEntity("Baeldung");

OkHttpClient client = // build an instance;
MockWebServer server = // build an instance;
Request request = new Request.Builder().url(server.url("...")).build();

3. Декодируйте тело ответа с помощью Джексона

Jackson-одна из самых популярных библиотек для привязки JSON-объектов.

Давайте добавим jackson-databind в ваш pom.xml:


    com.fasterxml.jackson.core
    jackson-databind
    2.9.9

Джексона ObjectMapper позволяет нам преобразовать JSON в объект. Таким образом, мы можем декодировать ответ с помощью ObjectMapper.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. Декодируйте тело ответа с помощью Gson

Gson – это еще одна полезная библиотека для сопоставления JSON с объектами и наоборот.

Давайте добавим песню в ваш pom.xml файл:


    com.google.code.gson
    gson
    2.8.5

Давайте посмотрим, как мы можем использовать Gson.from Json() для декодирования тела ответа:

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. Заключение

В этой статье мы рассмотрели несколько способов декодирования JSON-ответа OkHttp с помощью Jackson и Gson.

Полный образец доступен на на GitHub .