studio fromjson expected column but begin_object begin_array android json gson

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.