web-dev-qa-db-fra.com

gson jette une exception malformée

J'utilise gson pour convertir une chaîne json en un objet Java. La valeur de result2 est exactement la même que la valeur de result1. (Copié à partir du débogueur; barres obliques inverses ajoutées)

L'exception suivante est levée lors de la conversion de result1: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected EOF à la ligne 1 colonne 170

La conversion result2 fonctionne bien.

La chaîne json est valide selon 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;
}
65
Non

Je soupçonne que result1 a quelques caractères à la fin que vous ne pouvez pas voir dans le débogueur qui suivent la fermeture } personnage. Quelle est la longueur de result1 contre result2? Je note que result2 comme vous l'avez dit, il comporte 169 caractères.

GSON lève cette erreur particulière lorsqu'il y a des caractères supplémentaires après la fin de l'objet qui ne sont pas des espaces, et définit les espaces très étroitement (comme la spécification JSON fait) - seulement \t, \n, \r, et l'espace compte comme un espace. Notons en particulier que NUL (\0) les caractères ne comptent pas comme des espaces et provoqueront cette erreur.

Si vous ne pouvez pas facilement comprendre la cause des caractères supplémentaires à la fin et les éliminer, une autre option consiste à indiquer à GSON de procéder à une analyse syntaxique en mode clément:

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

D'après mon expérience récente, JsonReader#setLenient rend l'analyseur très tolérant, même pour autoriser des données JSON mal formées.

Toutefois, pour certaines données extraites de votre/vos API RESTful (confiance), cette erreur peut être provoquée par des espaces blancs. Dans ce cas, simplement trim les données éviteraient l'erreur:

String trimmed = result1.trim();

Ensuite, gson.fromJson(trimmed, T) devrait fonctionner comme prévu.

17
ryenus

Dans le débogueur, vous n'avez pas besoin d'ajouter de barres obliques, le champ de saisie comprend les caractères spéciaux.

Dans Java vous devez échapper aux caractères spéciaux

4
Mark Bakker