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

Ошибка JSON в Retrofit - Android

Восстановить пароль Регистрация
 
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
25.07.2016, 08:31     Ошибка JSON в Retrofit #1
Всем привет!
Недавно начал изучение 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 Android
Retrofit async не успевает загрузить данные Android
Android OPTIONS запросы в Retrofit
Android Retrofit, JSON, @POST, @GET
Разницы между OkHTTP AND Retrofit Android
Библиотека Retrofit Android
Android Retrofit + simpleXml может у кого есть примеры?
Android Получить заголовоки http ответа в retrofit
Android Retrofit 2. Возвращаемое значение == null
Android Относительные пути в аннотациях Retrofit
Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ? Android
Android Retrofit 2 эффективная обработка разных ответов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fraley
90 / 90 / 31
Регистрация: 24.05.2015
Сообщений: 249
25.07.2016, 08:37     Ошибка JSON в Retrofit #2
Цитата Сообщение от CoolMind Посмотреть сообщение
А если я, по старинке, хочу распарсить JSON самостоятельно?
А в чем тогда смысл использовать Retrofit?
Я тоже недавно решил изучить эту библиотеку, но пока что работал только с XML.
Насколько я понимаю вместо public String content должен быть массив?
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
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 {
        // Поля.
    }
}
Yandex
Объявления
25.07.2016, 10:58     Ошибка JSON в Retrofit
Ответ Создать тему
Опции темы

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