首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >gson抛出MalformedJsonException

gson抛出MalformedJsonException
EN

Stack Overflow用户
提问于 2012-07-14 21:54:50
回答 3查看 212K关注 0票数 80

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

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

转换result2工作正常。

根据jsonlint.com,json字符串是有效的。

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-15 08:11:01

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

当对象末尾有多余的非空格字符时,GSON就会抛出这个特定的错误,并且它定义的空格范围非常窄(正如JSON规范所做的那样)-只有\t\n\r和空格被算作空格。尤其是NUL,请注意,尾随的NUL (**\0**)字符不会算作空格,并将导致此错误

如果您不能很容易地找出导致末尾多余字符的原因并消除它们,另一种选择是告诉GSON在lenient模式下解析:

代码语言:javascript
复制
Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(result1));
reader.setLenient(true);
Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);
票数 111
EN

Stack Overflow用户

发布于 2014-09-17 19:04:39

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

但是,对于从trusted RESTful应用编程接口检索到的某些数据,此错误可能是由尾随空格引起的。在这种情况下,只需对数据执行trim操作即可避免错误:

代码语言:javascript
复制
String trimmed = result1.trim();

那么gson.fromJson(trimmed, T)可能会起作用。当然,这只涵盖了一种特殊情况,所以YMMV。

票数 20
EN

Stack Overflow用户

发布于 2012-07-14 22:01:23

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11484353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档