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;
}
646   3  

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

    Ничего не найдено.