gson бросает MalformedJsonException
Я использую gson преобразование json строка для Java-объекта.
Значение result2 точно такое же, как значение result1. (Скопировано из отладчика; добавлены обратные косые черты)
при преобразовании result1 возникает следующее исключение:
com.гуглить.гсон.JsonSyntaxException: com.гуглить.гсон.поток.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;
}
3 ответов:
Я подозреваю, что result1 имеет некоторые символы в конце его, что вы не можете видеть в отладчике, которые следуют за закрытием
}символ. Какова длинаresult1иresult2? Я отмечу, чтоresult2как вы процитировали он имеет 169 символов.GSON выдает эту конкретную ошибку, когда есть дополнительные символы после конца объекта, которые не являются пробелами, и он определяет пробелы очень узко (как это делает спецификация JSON) - только
\t,\n,\r, и Пробел считается пробелом. в частности, обратите внимание, что трейлинг NUL () символы не считаются пробелами и вызовут эту ошибку.если вы не можете легко выяснить, что вызывает дополнительные символы в конце и устранить их, другой вариант-сказать GSON для разбора в мягком режиме:
Gson gson = new Gson(); JsonReader reader = new JsonReader(new StringReader(result1)); reader.setLenient(true); Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);
из моего недавнего опыта,
JsonReader#setLenientв основном делает парсер очень терпимым, даже чтобы разрешить искаженные данные JSON.но для некоторых данных, полученных из доверенных RESTful API (ОВ), эта ошибка может быть вызвана конечными пробелами. В таких случаях просто
trimданные позволят избежать ошибки:String trimmed = result1.trim();затем
gson.fromJson(trimmed, T)должны работать, как ожидалось.
в отладчике вам не нужно добавлять обратные косые черты, поле ввода понимает специальные символы.
в коде java вам нужно избежать специальных символов
Comments