Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
#1

Ошибка JSON в Retrofit - Программирование Android

25.07.2016, 08:31. Просмотров 217. Ответов 2
Метки нет (Все метки)

Всем привет!
Недавно начал изучение Retrofit как известной библиотеки для REST-запросов. Там всё сильно автоматизировано, например, получение с сайта JSON и преобразование в объект. Допустим даже, что с сервера приходит адекватный JSON, а я нигде не ошибся в параметрах запроса. Но ошибся в структуре класса и, например, вместо массива строк указал просто строку.
Java
1
2
3
4
5
public class RequestObject {
    public int id;
    public String content; // Здесь неправильно указал.
    public String message;
}
В этом случае в обработчике onFailure я получу: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 24 path $.content
Это что, получается, Retrofit за меня решит, что надо прекратить выполнение? А если я, по старинке, хочу распарсить JSON самостоятельно?

Добавлено через 12 минут
Дополнительный вопрос.
На самом деле, там не массив строк, а массив JSON-объектов, это уж я для упрощения сначала написал. Т.е. получаю из запроса большой JSON, который содержит несколько полей и массив других объектов. Так вот, эти JSON-объекты могут меняться в зависимости от запроса. Можно ли использовать Generic'и? Здесь пишут, что, вроде бы, можно, но GSON будет по 2 раза распознавать JSON.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2016, 08:31     Ошибка JSON в Retrofit
Посмотрите здесь:

Retrofit, JSON, @POST, @GET - Программирование Android
Уважаемые программисты, прошу вашей помощи! Хожу на курсы по разработке мобильных приложений, месяц, как хожу, мало еще что знаю, но...

Библиотека Retrofit - Программирование Android
Мне нужно освоить библиотеку Retrofit.Я нашол урок https://www.youtube.com/watch?v=c5HX_GoyaDs. Я постарался повторить и у меня возникли...

Прокладывание маршрута и Retrofit - Программирование Android
Добрый день. Есть проблема с реализацией маршрутов в приложении. Суть проста: есть 2 точки, необходимо их соединить маршрутом. На основе...

OPTIONS запросы в Retrofit - Программирование Android
Всем привет, никто не сталкивался с данным вопросом? Я нашел в репозитории ретрофита какое-то упоминание но я не знаю как его примернить...

Ошибка при работе с JSON - Программирование Android
база на локальном сервере, если переходить по URL в браузере все выводит...андроид - нет вот така от ошибка... даже добавить нечего ...

Разницы между OkHTTP AND Retrofit - Программирование Android
Добрый вечер, ребята в чем разница между Retrofit и okHTTP это код Retrofit Retrofit retrofit = new Retrofit.Builder() ...

Извлечение модели ошибки retrofit + rx - Программирование Android
Работаю с Retrofit и RX. Через Gradle подключаю так: compile 'com.squareup.retrofit2:retrofit:2.0.0' compile...

Retrofit 2, POST запрос, авторизация - Программирование Android
Добрый день! На собеседовании (Junior Android Dev) мне дали задание написать приложение с авторизацией. Вот текст задачи: Все методы...

Работа с SOAP с помощью retrofit - Программирование Android
работа с SOAP с помощью retrofit или похожей библиотекой.. Ребята подскажите как работать с этим чудом SOAP? Как намного проще?

Retrofit 2. Возвращаемое значение == null - Программирование Android
Делаю небольшое приложение для VK. Решил использовать Retrofit 2. Набросал простенький запрос, но в ответ приходит код 200 и null. ...

Относительные пути в аннотациях Retrofit - Программирование Android
@GET("/feeds/flowers.json") Так аннотируется Get запрос Retrofit, где /feeds/flowers.json путь к Json файлу уже на сервере. А почему в...

RX и Retrofit запрос, который ничего не возвращает - Программирование Android
Делаю запросы так: subscription = getApi().getData(token) .subscribeOn(Schedulers.io()) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fraley
105 / 105 / 38
Регистрация: 24.05.2015
Сообщений: 316
25.07.2016, 08:37     Ошибка JSON в Retrofit #2
Цитата Сообщение от CoolMind Посмотреть сообщение
А если я, по старинке, хочу распарсить JSON самостоятельно?
А в чем тогда смысл использовать Retrofit?
Я тоже недавно решил изучить эту библиотеку, но пока что работал только с XML.
Насколько я понимаю вместо public String content должен быть массив?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
25.07.2016, 10:58  [ТС]     Ошибка JSON в Retrofit #3
Цитата Сообщение от fraley Посмотреть сообщение
А в чем тогда смысл использовать Retrofit?
Я имею в виду, что ошибка распознавания JSON теоретически может случиться на любом шаге. Что-то не докачалось, не та кодировка, не та структура, вообще не JSON (например, Error ...). В любом случае будет нокаут. А вот когда я раньше сам разбирал JSON, то мог, по крайней мере, понять, где именно случилась ошибка и поставить try-catch. Тут же я должен разобрать в логе, что случилось.
Согласен, тут, наверное, надо побольше поработать с Retrofit, чтобы оценить его преимущества.
Цитата Сообщение от fraley Посмотреть сообщение
Насколько я понимаю вместо public String content должен быть массив?
Да, конечно. Это я просто пример привёл. Мне-то хотелось сделать generic'и и массив.

Добавлено через 1 час 1 минуту
Небольшой поиск показывает (https://github.com/square/retrofit/issues/504, http://stackoverflow.com/questions/2...-json-response, http://stackoverflow.com/questions/3...eric-call-type), что Retrofit - это ахинея. Помимо того, что там сложно вытащить сам URL, по которому обращаешься, получаемый JSON, так ещё и Generic'и для "удобства" не добавлены. В общем, привет, баги и костыли.

Добавлено через 1 час 7 минут
Вроде бы, такой способ помог.
Объявил некий абстрактный класс, пусть будет примерно такой же:
Java
1
2
3
4
public abstract class Request {
    public int id;
    public String message;
}
Другие классы расширяют этот с добавлением того же поля, но разных типов, по вкусу.
Например,
Java
1
2
3
4
5
6
7
public class RequestChild extends Request {
    public SomeClass[] content;
 
    public static class SomeClass {
        // Поля.
    }
}
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru