Подтвердить что ты не робот

Gson выбрасывает MalformedJsonException

Я использую gson для преобразования строки json в Java-Object. Значение result2 точно такое же, как значение result1. (Скопировано из отладчика, добавлены обратные сальсы)

При преобразовании result1 выбрано следующее исключение: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: ожидаемый EOF в строке 1 столбца 170

Преобразование result2 отлично работает.

Строка json действительна в соответствии с jsonlint.com.

public static Userinfo getUserinfo()
{
    String result1 = http.POST("https://www.bitstamp.net/api/balance/",
                                postdata, true);
    String result2 = "{\"btc_reserved\": \"0\", \"fee\": \"0.5000\", \"btc_available\": \"0.10000000\", \"usd_reserved\": \"0\", \"btc_balance\": \"0.10000000\", \"usd_balance\": \"30.00\", \"usd_available\": \"30.00\"}";
    Gson gson = new Gson();
    Userinfo userinfo1 = gson.fromJson(result1, Userinfo.class); //throws Exception
    Userinfo userinfo2 = gson.fromJson(result2, Userinfo.class); //works fine

    return userinfo1;
}
private class Userinfo {

    public Userinfo(){
    }

    public float usd_balance;
    public float btc_balance ;
    public float usd_reserved;
    public float btc_reserved;
    public float usd_available;
    public float btc_available;
    public float fee;
    public float last_update;
}
4b9b3361

Ответ 1

Я подозреваю, что result1 имеет несколько символов в конце, которые вы не видите в отладчике, которые следуют за закрывающим символом }. Какова длина result1 по сравнению с result2? Отмечу, что result2, как вы указали, имеет 169 символов.

GSON выбрасывает эту конкретную ошибку, когда дополнительные символы после конца объекта не являются пробелами, и он определяет узлы очень узко (как это делает спецификация JSON) - только \t, \n, \r, а пробел считается пробелом. В частности, обратите внимание, что конечные символы NUL (\0) не считаются пробелами и будут вызывать эту ошибку.

Если вы не можете легко понять, что вызывает лишние символы в конце и устранить их, другой вариант - сообщить GSON о синтаксическом анализе в режиме мягкости:

Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(result1));
reader.setLenient(true);
Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);

Ответ 2

Из моего недавнего опыта JsonReader#setLenient в основном делает синтаксический анализатор очень толерантным, даже чтобы разрешить искаженные данные JSON.

Но для определенных данных, полученных из ваших надежных API (ов) RESTful, эта ошибка может быть вызвана завершением пробелов. В таких случаях просто trim данные могли бы избежать ошибки:

String trimmed = result1.trim();

Тогда gson.fromJson(trimmed, T) должен работать как ожидалось.

Ответ 3

В отладчике вам не нужно добавлять косые черты, поле ввода понимает специальные символы.

В java-коде вам нужно избегать специальных символов