java - online - gson lanza MalformedJsonException
object to jsonobject java (3)
Desde mi experiencia reciente, JsonReader#setLenient
básicamente hace que el analizador sea muy tolerante, incluso para permitir datos JSON malformados.
Pero para ciertos datos recuperados de su (s) API (s) RESTful de confianza, este error puede ser causado por espacios en blanco al final. En tales casos, simplemente trim
los datos evitaría el error:
String trimmed = result1.trim();
Entonces gson.fromJson(trimmed, T)
debería funcionar como se esperaba.
Estoy usando gson para convertir una cadena json a un objeto Java. El valor de result2 es exactamente el mismo que el valor de result1 . (Copiado del depurador; Se han agregado barras invertidas)
Se genera la siguiente excepción al convertir result1: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: EOF esperado en la línea 1 columna 170
La conversión de result2 funciona bien.
La cadena json es válida de acuerdo con 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;
}
En el depurador no necesita agregar barras diagonales inversas, el campo de entrada comprende los caracteres especiales.
En el código de Java necesitas escapar de los caracteres especiales
Sospecho que result1 tiene algunos caracteres al final que no se pueden ver en el depurador que sigue al carácter }
cierre. ¿Cuál es la duración del result1
frente al resultado2? result2
que result2
ya que has citado que tiene 169 caracteres.
GSON arroja ese error particular cuando hay caracteres adicionales después del final del objeto que no son espacios en blanco, y define los espacios en blanco muy estrechamente (como lo hace la especificación JSON) - solo /t
, /n
, /r
, y espacio cuentan como espacios en blanco . En particular, tenga en cuenta que los caracteres finales NUL ( /0
) no cuentan como espacios en blanco y causará este error .
Si no puede averiguar fácilmente qué es lo que está causando los caracteres adicionales al final y eliminarlos, otra opción es decirle a GSON que realice el análisis en modo indulgente:
Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(result1));
reader.setLenient(true);
Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);