2012-07-20 7 views
15

Ich versuche GSON zu verwenden, um einige sehr einfache JSON zu analysieren. Hier ist mein Code:GSON: Erwartete eine Zeichenfolge, aber war BEGIN_OBJECT?

Gson gson = new Gson(); 

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

Hier ist die JSON aus der URL zurückgegeben:

{ 
    "access_token": "abcdefgh" 
} 

Ich erhalte diese Ausnahme:

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

Irgendwelche Ideen? Ich bin neu bei GSON.

Antwort

23

Die JSON-Struktur ist ein Objekt mit einem Element namens "access_token" - es ist nicht nur eine einfache Zeichenfolge. Es könnte wie folgt zu einer übereinstimmenden Java-Datenstruktur wie einer Map deserialisiert werden.

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

Ein weiteres gemeinsames Konzept ist eine spezifischere Java-Datenstruktur zu verwenden, die die JSON übereinstimmt. Zum Beispiel:

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

Schöne Antwort Bruce! –

+0

Ich bin Sory, einen alten Thread zu treffen, neu zu Json, kannst du deine erste Antwort kurz erklären, bin ich verwirrt, Karte in Art token .. confused über zweiten Parameter in ** fromJson() ** Methode – SSH

4

Eine andere "low level" Möglichkeit, die Gson JsonParser mit:

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

Wenn Sie eines Tages eine benutzerdefinierte Deserializer schreiben werde, wird JsonElement Ihr bester Freund sein.

+1

Ty zu setzen. Ich habe genau das gemacht und brauchte genau diese Lösung. – Shadoninja

+0

Gern geschehen – giampaolo

Verwandte Themen