2012-07-14 13 views
54

Sto usando gson per convertire una stringa json in un oggetto Java. Il valore di risultato2 corrisponde esattamente al valore di risultato1. (Copiato da debugger; Backslashs aggiunto)gson lancia MalformedJsonException

La seguente eccezione viene generata result1 durante la conversione: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Si ritiene EOF alla riga 1 colonna 170

Conversione result2 funziona correttamente.

La stringa json è valida in base a 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; 
} 

risposta

84

Ho il sospetto che result1 ha alcuni caratteri alla fine di esso che non si può vedere nel debugger che seguono la chiusura } carattere. Qual è la lunghezza di result1 rispetto a result2? Noterò che result2 come hai indicato ha 169 caratteri.

GSON getta quel particolare errore quando c'è caratteri supplementari dopo la fine dell'oggetto che non sono spazi bianchi, e definisce gli spazi bianchi molto stretto (come la specifica JSON fa) - solo \t, \n, \r, e lo spazio conta come spazio bianco In particolare, si noti che i caratteri NUL (\0) finali non vengono conteggiati come spazi bianchi e causeranno questo errore.

Se non si può facilmente capire che cosa sta causando i caratteri extra alla fine ed eliminarli, un'altra opzione è quella di raccontare GSON di analizzare in modo indulgente:

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

Grazie! La mia classe HTTP ha scaricato la stringa json in un buffer char da 256 byte che è stato poi convertito in una stringa (result1).Per questo motivo, risultato1 aveva una lunghezza di 255 anziché di 169. – Non

+0

Ho avuto lo stesso problema; l'intera faccenda EOF nel tipo di eccezione mi ha gettato, il mio problema era semplicemente JSON, formato in modo semplice e puro. – Kong

+2

Ho avuto lo stesso problema, ma ho ottenuto il mio JSON tramite un FileChannel. Ero abbastanza sicuro che la codifica fosse a posto. Quello che ho fatto è stato chiamare il metodo trim() sulla stringa rossa dal file su HDD, questo ha risolto il problema. –

3

Nel debugger non è necessario aggiungere indietro barre, il campo di inserimento comprende i caratteri speciali.

Nel codice Java è necessario per sfuggire ai caratteri speciali

+0

Ho copiato il valore di risultato1 dal debugger e ho aggiunto barre retroverse in seguito per evitare i caratteri speciali in result2;) – Non

+0

Potrebbe esserci uno spazio char o \ n \ r davanti o aggiunto alla stringa json. Dovrebbe essere qualcosa di semplice –

+0

Qual è il risultato di result1.equals (risultato2)? –

16

Dalla mia esperienza recente, JsonReader#setLenient fondamentalmente rende il parser molto tollerante, anche per consentire dati JSON malformati.

Ma per alcuni dati recuperati dal RESTful API di fiducia (s), questo errore potrebbe essere causato da spazi finali bianchi. In questi casi, è sufficiente trim i dati sarebbero evitare l'errore:

String trimmed = result1.trim(); 

Poi gson.fromJson(trimmed, T) dovrebbe funzionare come previsto.

+0

hi @ ryenus, se io due parole con spazio tra di noi allora cosa fare? – Qasim

+2

Cosa accadrebbe se gli spazi bianchi fossero importanti nella risposta stringa? Tirmming non è buono in questo caso. Perderai l'integrità dei tuoi dati. – AnixPasBesoin