81

我正在使用gsonjson字符串转换为 Java-Object。result2的值与result1的值完全相同。(从调试器复制;添加了反斜杠)

转换 result1 时引发以下异常: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected EOF at line 1 column 170

转换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;
}
4

3 回答 3

111

我怀疑 result1 末尾有一些字符,您在调试器中看不到结束字符之后的}字符。result1vs的长度是result2多少?我会注意到,result2正如您所引用的,它有 169 个字符。

当对象末尾有非空格的额外字符时,GSON 会抛出该特定错误,并且它非常狭窄地定义了空格(正如 JSON 规范所做的那样) - 只有\t\n\r和空格算作空格。特别要注意尾随的 NUL ( \0) 字符不算作空格,会导致此错误

如果您无法轻松找出导致最后多余字符的原因并消除它们,另一种选择是告诉 GSON 以宽松模式解析:

Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(result1));
reader.setLenient(true);
Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);
于 2012-07-15T00:11:00.730 回答
20

根据我最近的经验,JsonReader#setLenient基本上使解析器非常宽容,甚至允许格式错误的 JSON 数据。

但对于从您受信任的 RESTful API 检索到的某些数据,此错误可能是由尾随空格引起的。在这种情况下,只需trim数据即可避免错误:

String trimmed = result1.trim();

然后gson.fromJson(trimmed, T)可能会工作。当然,这仅涵盖一种特殊情况,因此 YMMV。

于 2014-09-17T11:04:38.720 回答
4

在调试器中,您不需要添加反斜杠,输入字段可以理解特殊字符。

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

于 2012-07-14T14:01:23.437 回答