我使用 gson 将 json 字符串转换为Java-Object。 result2 的值与 result1 的值完全相同。 (从调试器复制;添加了反斜杠)
转换result1时抛出以下异常: com.google.gson.JsonSyntaxException:com.google.gson.stream.MalformedJsonException:第1行第170列的预期EOF
转换 result2 可以正常工作。
根据jsonlint.com,json字符串有效。
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;
}
答案 0 :(得分:94)
我怀疑result1在其末尾有一些字符,你在调试器中看不到关闭}
字符。 result1
与result2
的长度是多少?我会注意到result2
,因为你引用它有169个字符。
GSON在非空白对象结束后有额外字符时会抛出该特定错误,并且它将非常的空白定义为狭窄(如JSON规范所做) - 仅{{1} },\t
,\n
和空格数为空格。 请注意,尾随NUL(\r
)字符不算作空格并会导致此错误。
如果你不能轻易找出最终导致额外字符的原因并消除它们,另一种选择是告诉GSON以宽松模式解析:
\0
答案 1 :(得分:17)
根据我最近的经验,JsonReader#setLenient
基本上使解析器非常宽容,甚至允许格式错误的JSON数据。
但对于从您的受信任RESTful API检索的某些数据,此错误可能是由尾随空格引起的。在这种情况下,只需trim
数据就可以避免错误:
String trimmed = result1.trim();
然后gson.fromJson(trimmed, T)
应按预期工作。
答案 2 :(得分:4)
在调试器中,您不需要添加反斜杠,输入字段可以理解特殊字符。
在java代码中,您需要转义特殊字符