2012-07-20 5 views
15

Sto provando a usare GSON per analizzare un JSON molto semplice. Ecco il mio codice:GSON: prevedeva una stringa ma era BEGIN_OBJECT?

Gson gson = new Gson(); 

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

Ecco il JSON restituito dal url:

{ 
    "access_token": "abcdefgh" 
} 

sto ottenendo questa eccezione:

E/AndroidRuntime(19447): com.google.gson.JsonSyntaxException:  java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 

Tutte le idee? Sono nuovo di GSON.

risposta

23

La struttura JSON è un oggetto con un elemento denominato "access_token" - non è solo una semplice stringa. Potrebbe essere deserializzato in una struttura dati Java corrispondente, come una mappa, come segue.

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); 
    } 
} 

Un altro approccio comune consiste nell'utilizzare una struttura di dati Java più specifica che corrisponde al JSON. Per esempio:

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

Bella risposta Bruce! –

+0

Sono pronto a scrivere un vecchio thread, nuovo a Json, posso spiegare brevemente la prima risposta, sono confuso dal mettere il token Map in type..confused sul secondo parametro in ** fromJson() ** metodo – SSH

4

Un'altra possibilità "di basso livello" utilizzando il 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); 
    } 
} 

Se un giorno si scrive un deserializzatore personalizzato, JsonElement sarà il vostro migliore amico.

+1

Ty. Stavo facendo questo esatto genere di cose e avevo bisogno di questa soluzione esatta. – Shadoninja

+0

Prego – giampaolo