81

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

3 に答える 3

111

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);
于 2012-07-15T00:11:00.730 に答える
20

私の最近の経験から、JsonReader#setLenient基本的にパーサーは非常に寛容になり、不正な形式の JSON データを許可することさえできます。

ただし、信頼できる RESTful API から取得した特定のデータの場合、このエラーは末尾の空白が原因である可能性があります。このような場合、単純trimにデータだけでエラーを回避できます。

String trimmed = result1.trim();

それならうまくいくgson.fromJson(trimmed, T)かもしれません。確かに、これは特殊なケースだけをカバーしているので、YMMV.

于 2014-09-17T11:04:38.720 に答える
4

デバッガーでは、バック スラッシュを追加する必要はありません。入力フィールドは特殊文字を認識します。

Javaコードでは、特殊文字をエスケープする必要があります

于 2012-07-14T14:01:23.437 に答える