gson抛出MalformedJsonException

Non*_*Non 68 java json gson

我正在使用gsonjson字符串转换为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;
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*tin 99

我怀疑result1在它的末尾有一些字符,你在调试器中看不到关闭}字符.result1对战的长度是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);
Run Code Online (Sandbox Code Playgroud)

  • 我有同样的问题,但我通过FileChannel获得了我的JSON.我很确定编码是好的.我所做的是从HDD上的文件调用String red上的trim()方法,这解决了这个问题. (3认同)
  • @ThePaul - 你的字符串末尾可能有额外的NUL(即'\ 0')字符.String.trim()不仅删除空格,还删除任何小于32的字符,而GSON将这些字符计为尾随垃圾.(然后它抱怨"我看到了闭合支撑,所以接下来应该看到一个EOF,但我看到了一些其他东西") (3认同)

rye*_*nus 17

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

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

String trimmed = result1.trim();
Run Code Online (Sandbox Code Playgroud)

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

  • 如果字符串响应中的空格很重要怎么办?在这种情况下,Tirmming并不好.您将失去数据的完整性. (3认同)
  • 嗨@ryenus,如果我两个单词之间有空格,那该怎么办? (2认同)