我正在使用gson将json字符串转换为Java对象。result2的值与result1的值完全相同。(从调试器复制;添加反斜杠)
在第1行第170列转换result1: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException:预期的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;
}
发布于 2012-07-15 08:11:01
我怀疑在结束}
字符之后的调试器中看不到result1末尾的一些字符。result1
和result2
的长度是多少?我会注意到您引用的result2
有169个字符。
当对象末尾有多余的非空格字符时,GSON就会抛出这个特定的错误,并且它定义的空格范围非常窄(正如JSON规范所做的那样)-只有\t
、\n
、\r
和空格被算作空格。尤其是NUL,请注意,尾随的NUL (**\0
**)字符不会算作空格,并将导致此错误。
如果您不能很容易地找出导致末尾多余字符的原因并消除它们,另一种选择是告诉GSON在lenient模式下解析:
Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(result1));
reader.setLenient(true);
Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);
发布于 2014-09-17 19:04:39
根据我最近的经验,JsonReader#setLenient
基本上使解析器非常容错,甚至允许错误的JSON数据。
但是,对于从trusted RESTful应用编程接口检索到的某些数据,此错误可能是由尾随空格引起的。在这种情况下,只需对数据执行trim
操作即可避免错误:
String trimmed = result1.trim();
那么gson.fromJson(trimmed, T)
可能会起作用。当然,这只涵盖了一种特殊情况,所以YMMV。
发布于 2012-07-14 22:01:23
在调试器中,您不需要添加反斜杠,输入字段可以识别特殊字符。
在java代码中,您需要转义特殊字符。
https://stackoverflow.com/questions/11484353
复制相似问题