2012-07-14 9 views
54

gsonjson文字列をJavaオブジェクトに変換しています。 の結果2の値は、の結果1の値とまったく同じです。 (デバッガからコピー; Backslashsを添加)結果1を変換しながら、次の例外がスローされgson throw MalformedJsonException

を: com.google.gson.JsonSyntaxException:com.google.gson.stream.MalformedJsonException:行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; 
} 

答えて

84

私は結果1あなたは決算}文字に続くデバッガで見ることができない、それの終わりにいくつかの文字を持っていることを疑うをエスケープする必要があります。 result1result2の長さはどのくらいですか?あなたが引用した通りresult2には169文字あることに注意してください。

そこに余分な文字が空白でないオブジェクトの終了後だし、それは狭く非常に空白を定義するときGSONは(JSONの仕様がするように)その特定のエラーがスローされます - だけ\t\n\r、そしてスペース空白として数えます。 特に、末尾のNUL(\0)文字は空白としてカウントされず、このエラーが発生します()。基本的に、私の最近の経験から

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

ありがとうございました!私のHTTPクラスは、文字列(result1)に変換された256バイトのcharバッファにjson文字列をダウンロードしました。そのため、result1の長さは169ではなく255になりました。 – Non

+0

同じ問題がありました。例外的な種類のEOFの事が私を投げ捨てました。私の問題は単なる純粋でシンプルなJSONでした。 – Kong

+2

同じ問題がありましたが、FileChannel経由でJSONを取得しました。私はエンコードが正当だったと確信していました。私がやったのは、HDD上のファイルから赤色の文字列に対してtrim()メソッドを呼び出すことでしたが、これが問題を解決しました。 –

3

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

は、Javaコードでは、特殊文字

+0

私はデバッガからresult1の値をコピーし、後でバックスラッシュを追加してresult2の特殊文字をエスケープしました;) – Non

+0

json文字列の先頭にスペース文字または\ n \ rがあります。それは何か簡単でなければならない –

+0

result1.equals(result2)の結果は何ですか? –

16

JsonReader#setLenientを:あなたは簡単に終わりに余分な文字を引き起こしているかを把握し、それらを排除することができない場合

は、別のオプションは寛大なモードで解析するGSONを伝えることですパーサーは非常に寛容で、たとえ不正な形式のJSONデータを受け入れることさえできます。

信頼できるRESTful APIから取得した特定のデータの場合、このエラーは後続の空白が原因で発生している可能性があります。このような場合には、単にtrimデータは、エラーを回避します:予想通りその後

String trimmed = result1.trim(); 

gson.fromJson(trimmed, T)は動作するはずです。

+0

hi @リエヌス、もし私が2つの単語の間にスペースがあれば、どうしたらいいですか? – Qasim

+2

文字列の応答に空白がある場合はどうなりますか?そのような場合にはチルミングは良くありません。あなたはあなたのデータの完全性を失うでしょう。 – AnixPasBesoin

関連する問題