当前位置: 首页 > 知识库问答 >
问题:

gson引发MalformedJsonException

窦伟
2023-03-14

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

转换Result1:com.google.gson.JsonSyntaxException时引发以下异常:com.google.gson.stream.MalFormedJsonException:第1行第170列需要EOF

转换result2工作良好。

json字符串根据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;
}

共有1个答案

周马鲁
2023-03-14

我怀疑result1的末尾有一些字符,您在调试器中看不到,这些字符跟在结尾的}字符后面。result1result2的长度是多少?我将注意到您引用的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);
 类似资料:
  • 问题内容: 我正在尝试使用Google App Engine上的GSON库将对象转换为JSON。由于某种原因,它将引发此异常,我不知道如何解决此问题。有什么建议? 我正在使用的代码: 问题答案: 该应用程序引擎确实支持反射-但是,您正在尝试反射JRE类的私有字段: 反射 允许应用程序完全,无限制地反射访问其自己的类。它可以查询任何私有成员,使用java.lang.reflect.Accessibl

  • 我将请求映射到类,如下所示: 有人能解释为什么我在请求中的数组没有与类A中的数组映射吗?

  • 问题内容: 我在Java EE服务器上使用GSON为视图提供一些json。在某个对象中,我有很长的文字,可以包含任何内容(例如“多么的“好”新闻!”)。 我很惊讶,默认情况下,GSON不会转义双引号,因此它不会生成有效的JSON。 有这样做的好方法吗? 问题答案: 也许我不理解您的问题,但是我能够让GSON处理带引号的字符串,而无需进行任何设置或更改。 输出: 也许我不明白您的要求?

  • 我正在开发一个应用程序,它使用Gson作为JSON反序列化器,需要从REST API反序列化多态JSON。在解释mi问题之前,请注意,我已经用Gson研究了多态反序列化,并在几个案例中成功地实现了它。这是我面临的一个具体问题。在问这个问题之前,我也读过这篇很棒的帖子和关于堆栈溢出的讨论。顺便说一下,我正在使用RuntimeTypeAdapterFactory来反序列化多态对象。 我遇到的问题是,G

  • 我在反序列化遵循以下格式的Json数组时遇到了一些问题: 它基本上是一个类别数组,其中每个类别也可以有一个子类别列表,依此类推。我的类模型看起来有点像这样: 现在,Gson显然抱怨循环引用。有没有办法解析这个Json输入,因为我不能假设有多少个类别级别?提前感谢。 编辑:以防万一有人有类似的问题,根据Spaeth的回答,我将解决方案调整为使用反射的更一般的情况。唯一的要求是JSON数组表示的对象列

  • 问题内容: 我正在尝试将内容反序列化为自定义类型。 这段代码 引发跟随异常 为什么Gson无法将我的JSON文本正确转换为我的POJO类型? 问题答案: 作为异常消息状态 反序列化时,Gson期望使用JSON对象,但发现了一个JSON数组。由于无法从一种转换为另一种,因此引发了此异常。 此处描述JSON格式。简而言之,它定义了以下类型:对象,数组,字符串,数字和null,以及布尔值和。 在Gson