fromjson - expected begin_array but was string at line 1 column 1 path $ android studio
GSON: ¿Se esperaba una cadena pero fue BEGIN_OBJECT? (2)
Estoy tratando de usar GSON para analizar algunos JSON muy simples. Aquí está mi código:
Gson gson = new Gson();
InputStreamReader reader = new InputStreamReader(getJsonData(url));
String key = gson.fromJson(reader, String.class);
Aquí está el JSON devuelto de la url:
{
"access_token": "abcdefgh"
}
Estoy recibiendo esta excepción:
E/AndroidRuntime(19447): com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2
¿Algunas ideas? Soy nuevo en GSON.
La estructura JSON es un objeto con un elemento llamado "access_token", no es solo una cadena simple. Podría deserializarse a una estructura de datos Java coincidente, como un Mapa, como se indica a continuación.
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class GsonFoo
{
public static void main(String[] args)
{
String jsonInput = "{/"access_token/": /"abcdefgh/"}";
Map<String, String> map = new Gson().fromJson(jsonInput, new TypeToken<Map<String, String>>() {}.getType());
String key = map.get("access_token");
System.out.println(key);
}
}
Otro enfoque común es utilizar una estructura de datos Java más específica que coincida con el JSON. Por ejemplo:
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
public class GsonFoo
{
public static void main(String[] args)
{
String jsonInput = "{/"access_token/": /"abcdefgh/"}";
Response response = new Gson().fromJson(jsonInput, Response.class);
System.out.println(response.key);
}
}
class Response
{
@SerializedName("access_token")
String key;
}
Otra posibilidad de "bajo nivel" usando el Gson JsonParser:
package .questions.q11571412;
import com.google.gson.*;
public class GsonFooWithParser
{
public static void main(String[] args)
{
String jsonInput = "{/"access_token/": /"abcdefgh/"}";
JsonElement je = new JsonParser().parse(jsonInput);
String value = je.getAsJsonObject().get("access_token").getAsString();
System.out.println(value);
}
}
Si un día escribirás un deserializador personalizado, JsonElement será tu mejor amigo.