1. ホーム
  2. java

[解決済み] gson は MalformedJsonException をスローします。

2022-02-04 17:48:18

質問

を使っています。 gson を変換するために json の文字列をJava-Objectに変換します。 の値は 結果2 の値とまったく同じである。 結果1 . (デバッガからコピー、バックスラッシュを追加)。

result1 の変換中に次のような例外が発生しました。 com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException.JsonSyntaxException: 1行目170列目でEOFが予想されます。

変換する 結果2 は問題なく動作します。

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;
}

解決方法は?

result1の末尾に、デバッガでは見えない文字があり、それがclosingの後に続いているのではないでしょうか。 } 文字があります。の長さはどれくらいですか? result1result2 ? と記しておきます。 result2 のように、169文字になります。

GSON は、オブジェクトの末尾に空白でない余分な文字がある場合にこのようなエラーを投げます。 非常に JSON仕様のように)狭い範囲でしか \t , \n , \r およびスペースは空白としてカウントされます。 特に、末尾のNUL( \0 ) 文字はホワイトスペースとしてカウントされないので、このエラーを引き起こします。 .

もし、最後の余分な文字の原因を突き止め、それを取り除くことが難しい場合は、GSONにlenient modeでパースするように指示するのも一つの方法です。

Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(result1));
reader.setLenient(true);
Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);