С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748

Ошибка JSON в Retrofit

25.07.2016, 08:31. Показов 2146. Ответов 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.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.07.2016, 08:31
Ответы с готовыми решениями:

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

Корректность json для retrofit Response
Есть Shipment.json такого содержания: private int id; private int pickupDateFrom; private int pickupDateTo; private Map<Integer,...

Retrofit и Gson ошибка
Подскажите, пожалуйста, в чем причина ошибки, не могу понять, что не так. Код тут: https://github.com/Mipludeum/Movie2 ...

2
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
25.07.2016, 08:37
Цитата Сообщение от CoolMind Посмотреть сообщение
А если я, по старинке, хочу распарсить JSON самостоятельно?
А в чем тогда смысл использовать Retrofit?
Я тоже недавно решил изучить эту библиотеку, но пока что работал только с XML.
Насколько я понимаю вместо public String content должен быть массив?
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
25.07.2016, 10:58  [ТС]
Цитата Сообщение от 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/quest... n-response, http://stackoverflow.com/quest... -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 {
        // Поля.
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2016, 10:58
Помогаю со студенческими работами здесь

Ошибка Retrofit-a: Too many follow-up requests: 21
Есть запрос с урлом типа www6.blabla.ru:9120/endpointone/two в нем есть хеадер "Token". И ошибка HTTP FAILED: java.net.ProtocolException:...

Ошибка - Errororg.json.JSONExceprion: Value bd.json of type java.lang.String cannot be converted to JSONObject
Здравствуйте! Есть база данных bd.json, которая находится в проекте в папке assets. Вот содержимое базы данных; { "name":...

Ошибка при обработке Json - Cannot deserialize the current JSON array because the type requires a JSON object
Дополнительные сведения: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1'...

Ошибка при обработке Json - Cannot deserialize the current JSON array because the type requires a JSON object
Всем привет! Помогите, плиз, разобраться с ошибкой: An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException'...

Ошибка в коде SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
не пойму в чем ошибка вот код header("Content-Type: application/json; encoding=utf-8"); $uid = intval($_GET); $userid =...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru