gson抛出MalformedJsonException

时间:2012-07-14 13:54:50

标签: java json gson

我使用 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;
}

3 个答案:

答案 0 :(得分:94)

我怀疑result1在其末尾有一些字符,你在调试器中看不到关闭}字符。 result1result2的长度是多少?我会注意到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代码中,您需要转义特殊字符