У меня есть такой способ:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
И я хочу проанализировать JSON с помощью:
public static void addObject(String IP, Object addObject) {
try {
String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
addObject = ConfigJSONParser.parseStringToObject(json);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Но я получаю сообщение об ошибке:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: ожидалось BEGIN_OBJECT, но было STRING в строке 1, столбце 1
Ответы:
Даже не видя свою строку JSON, вы можете сказать по сообщению об ошибке, что это неправильная структура для анализа в экземпляр вашего класса.
Gson ожидает, что ваша строка JSON будет начинаться с открывающей скобки объекта. например
Но строка, которую вы ему передали, начинается с открытых кавычек
источник
parseStringToObject
предполагает, что он ожидает объект JSON, который всегда начинается с{
.{"ip":"192.167.1.15"}
отRestful EJB web service with jboss EAP 7.1
во внутреннем интерфейсе. Однако я получаю сообщение «Ожидаемый BEGIN_OBJECT, но был STRING в строке 1, столбец 1». Помогите мне, пожалуйста ... Это моя веб-служба: @Stateless @Path ("/ getflashcard") публичный класс GetFlashcard {@Interceptors (Validator.class) @GET @Produces (MediaType.APPLICATION_JSON) public String getFlashcard () {String jsonString = new JSONObject (). Put ("ip", "192.167.1.15"). ToString (); return jsonString; }}Недействительный JSON с сервера всегда должен быть ожидаемым вариантом использования. Миллион вещей может пойти не так во время передачи. Gson немного сложен, потому что его вывод ошибок даст вам одну проблему, а фактическое исключение, которое вы поймаете, будет другого типа.
Учитывая все это, правильное исправление на стороне клиента
Если вы хотите узнать, почему JSON, который вы получили от сервера, неправильный, вы можете заглянуть в свой блок catch на исключение. Но даже если это ваша проблема, клиент не обязан исправлять JSON, который он получает из Интернета.
В любом случае, клиент должен решить, что делать, если JSON станет плохим. Две возможности: отклонить JSON, ничего не делать и повторить попытку.
Если вы собираетесь повторить попытку, я настоятельно рекомендую установить флаг внутри блока try / catch, а затем реагировать на этот флаг вне блока try / catch. Вложенный метод try / catch, вероятно, является причиной того, как Gson ввел нас в этот беспорядок, когда наша трассировка стека и исключения не совпадают.
Другими словами, хотя я признаю, что это выглядит не очень элегантно, я бы рекомендовал
источник
В Retrofit2, когда вы хотите отправить свои параметры в необработанном виде, вы должны использовать скаляры.
сначала добавьте это в свой градиент:
мой SampleActivity:
Ссылка: [ Как отправить необработанный весь JSON в тело запроса на модернизацию?
источник
Возможно, вы
JSON Object
правы, но полученный вами ответ не является вашими действительными данными. Точно так же, как при подключении недопустимогоWiFi
, вы можете получить странный ответ,< html>.....< /html>
которыйGSON
невозможно разобрать.вам может потребоваться что-то сделать
try..catch..
для этого странного ответа, чтобы избежать сбоя.источник
Я пришел, чтобы поделиться решением. Ошибка произошла у меня после принудительного зависания нотбука. возможное решение
clean preject
.источник
Убедитесь, что у вас есть DESERIALIZED объекты, такие как DATE / DATETIME и т. Д. Если вы напрямую отправляете JSON без десериализации, это может вызвать эту проблему.
источник
В моей ситуации у меня есть «модель», состоящая из нескольких параметров String, за исключением одного: это массив байтов
byte[]
. Некоторый фрагмент кода:Последняя строка выше - когда
срабатывает. Просматривая SO, я понял, что мне нужна какая-то форма
Adapter
для преобразования моегоBaseModel
туда и обратно JsonObject. СмешиваниеString
иbyte[]
в модели действительно усложняет дело. Видимо,Gson
не очень нравится ситуация.Я в конечном итоге , сделав
Adapter
для обеспеченияbyte[]
преобразуется вBase64
формат. Вот мойAdapter
класс:Чтобы преобразовать JSONObject в модель, я использовал следующее:
Точно так же, чтобы преобразовать модель в JSONObject, я использовал следующее:
Код в основном продвигает предполагаемый
class/object
(в данном случаеbyte[]
класс) черезAdapter
объект всякий раз, когда он встречается во время преобразования в / из JSONObject.источник
Не используйте
jsonObject.toString
объект JSON.источник
В моем случае я возвращаю объект JSON как
Решено, изменив его на
Здесь данные являются подчиненным JsonObject и должны начинаться с {not ""
источник
если ваш формат json и переменные в порядке, проверьте запросы к базе данных ... даже если данные сохранены в db правильно, настоящая проблема может быть там ... перепроверьте свои запросы и попробуйте еще раз .. Надеюсь, это поможет
источник
Не забудьте сначала преобразовать свой объект в Json, используя Gson ()
Затем вы можете легко преобразовать его обратно в объект с помощью этой замечательной библиотеки.
источник
У меня был случай, когда я читал из рукописного файла json. JSON идеален. Однако произошла эта ошибка. Поэтому я пишу из java-объекта в json-файл, а затем читаю из этого json-файла. все в порядке. Я не видел никакой разницы между рукописным json и java-объектом. Пробовал дальшеCompare не видит разницы. Наконец я заметил, что два размера файлов немного различаются, и я использовал инструмент winHex и обнаружил лишние вещи. Итак, решение для моей ситуации - сделать копию хорошего json-файла, вставить в него содержимое и использовать.
источник