java - gson 抛出 MalformedJsonException

标签 java json gson

我正在使用 gsonjson 字符串转换为 Java-Object。 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;
}

最佳答案

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

当对象末尾有非空格的额外字符时,GSON 会抛出该特定错误,并且它定义空格 very 狭义(如 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);

关于java - gson 抛出 MalformedJsonException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11484353/

相关文章:

java - 如何在不编写自己的解析器的情况下获取 SPARUL INSERT Data 语句中包含的所有三元组?

java - 在java中转换80位扩展精度

javascript - 如何在knockoutjs中使用原型(prototype)对象的实例而不是JSON

json - JSONP 过时了吗?

javascript - 覆盖或更改 package.json "homepage"值

json - 将json的日期属性反序列化为LocalDate

java - 处理动态 Web 服务

android - 在安卓中使用 Gson

java - Scala 的另一个 "Unable to instantiate activity ComponentInfo"

Java如何在值更新时维护数组列表中扫描对象的顺序