com.google.gson.Исключение JsonSyntaxException: java.lang.Исключение IllegalStateException: Ожидаемый BEGIN_OBJECT, но был СТРОКОЙ в строке 1, столбец 1
Переведено автоматически
Ответ 1
Даже не видя вашу строку JSON, вы можете сказать из сообщения об ошибке, что это неправильная структура для разбора в экземпляре вашего класса.
Gson ожидает, что ваша строка JSON будет начинаться с открывающей объект фигурной скобки. например
{
Но строка, которую вы ему передали, начинается с открытых кавычек
"
Ответ 2
Недопустимый JSON с сервера всегда должен быть ожидаемым вариантом использования. Миллион вещей может пойти не так во время передачи. Gson немного сложен, потому что его вывод ошибки выдаст вам одну проблему, а фактическое исключение, которое вы поймаете, будет другого типа.
Имея все это в виду, правильное исправление на стороне клиента - это
Если вы хотите знать, почему JSON, полученный вами с сервера, неверен, вы можете заглянуть в свой блок catch и посмотреть исключение. Но даже если это ваша проблема, клиент не несет ответственности за исправление JSON, который он получает из Интернета.
В любом случае, клиент несет ответственность за то, чтобы решить, что делать, когда он получает неверный JSON. Две возможности - отклонить JSON и ничего не делать, а затем попробовать снова.
Если вы собираетесь попробовать еще раз, я настоятельно рекомендую установить флаг внутри блока try / catch, а затем отвечать на этот флаг вне блока try / catch. Вложенная попытка / catch, вероятно, из-за того, что Gson втянул нас в эту неразбериху с нашей трассировкой стека и не совпадающими исключениями.
Другими словами, хотя я признаю, что это выглядит не очень элегантно, я бы рекомендовал
Недавно у меня была похожая проблема, и я нашел интересное решение. По сути, мне нужно было десериализовать следующую вложенную строку JSON в мой POJO:
"{\"restaurant\":{\"id\":\"abc-012\",\"name\":\"good restaurant\",\"foodType\":\"American\",\"phoneNumber\":\"123-456-7890\",\"currency\":\"USD\",\"website\":\"website.com\",\"location\":{\"address\":{\"street\":\" Good Street\",\"city\":\"Good City\",\"state\":\"CA\",\"country\":\"USA\",\"postalCode\":\"12345\"},\"coordinates\":{\"latitude\":\"00.7904692\",\"longitude\":\"-000.4047208\"}},\"restaurantUser\":{\"firstName\":\"test\",\"lastName\":\"test\",\"email\":\"test@test.com\",\"title\":\"server\",\"phone\":\"0000000000\"}}}"
В итоге я использовал regex для удаления открытых кавычек из начала и конца JSON, а затем использовал метод apache.commonsunescapeJava(), чтобы отменить его. В основном передал нечистый JSON в следующий метод, чтобы получить обратно очищенный: