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 .