2012-07-20 11 views
15

Estoy tratando de usar GSON para analizar un JSON muy simple. Aquí está mi código:GSON: ¿esperaba una cadena pero era BEGIN_OBJECT?

Gson gson = new Gson(); 

    InputStreamReader reader = new InputStreamReader(getJsonData(url)); 
    String key = gson.fromJson(reader, String.class); 

aquí está el JSON volvió de la url:

{ 
    "access_token": "abcdefgh" 
} 

Me estoy poniendo 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 

¿Alguna idea? Soy nuevo en GSON.

Respuesta

23

La estructura JSON es un objeto con un elemento llamado "access_token" - no es solo una cadena simple. Se puede deserializar a una estructura de datos Java correspondiente, como un Mapa, de la siguiente manera.

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; 
} 
+1

¡Buena respuesta Bruce! –

+0

Tengo que pegarle a un hilo viejo, nuevo para Json, puede explicar brevemente su primera respuesta, estoy confundido acerca de poner Map en el token de tipo..confused sobre el segundo parámetro en ** fromJson() ** método – SSH

4

Otra posibilidad de "bajo nivel" con el Gson JsonParser:

package stackoverflow.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 voy a escribir un deserializer encargo, JsonElement será su mejor amigo.

+1

Ty. Estaba haciendo exactamente este tipo de cosas y necesitaba esta solución exacta. – Shadoninja

+0

De nada – giampaolo

Cuestiones relacionadas