gson抛出MalformedJsonException

我正在使用gsonjsonstring转换为Java对象。 result2的值与result1的值完全相同。 (从debugging器复制;添加了反斜杠)

转换result1时将引发以下exception: com.google.gson.JsonSyntaxException:com.google.gson.stream.MalformedJsonException:第1行中的预期EOF列170

转换result2工作正常。

jsonstring根据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; } 

我怀疑result1的末尾有一些字符,在debugging器中看不到closures}字符。 result1result2的长度是多less? 我会注意到result2引用有169个字符。

如果在对象结束后还有一些不是空格的字符时,GSON会抛出这个特殊错误,并且它非常狭窄地定义了空格(正如JSON规范所做的那样) – 只有\t\n\r和空格会被当作空格。 尤其要注意的是,尾随的NUL( \0 )字符不会被视为空白,并会导致此错误

如果你不能很容易地找出最后引起多余字符的原因并消除它们,另一个select是告诉GSON在宽松模式下进行parsing:

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

从我最近的经验来看, JsonReader#setLenient基本上使parsing器非常宽容,甚至允许格式不正确的JSON数据。

但是对于从您可信的RESTful API中检索的某些数据,这个错误可能是由于尾随的空格造成的。 在这种情况下,简单地trim数据将避免错误:

 String trimmed = result1.trim(); 

然后gson.fromJson(trimmed, T)应该按预期工作。

在debugging器中,您不需要添加反斜线,input字段理解特殊字符。

在Java代码中,您需要转义特殊字符