GSON: Ожидалась строка, но BEGIN_OBJECT?

Я пытаюсь использовать GSON для анализа очень простого JSON. Вот мой код:

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

Вот JSON, возвращенный с URL:

 { "access_token": "abcdefgh" } 

Я получаю это исключение:

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

Есть идеи? Я новичок в GSON.

Solutions Collecting From Web of "GSON: Ожидалась строка, но BEGIN_OBJECT?"

Структура JSON представляет собой объект с одним элементом с именем «access_token» – это не просто простая строка. Его можно десериализовать до соответствующей структуры данных Java, такой как Карта, следующим образом.

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

Другим распространенным подходом является использование более конкретной структуры данных Java, которая соответствует JSON. Например:

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

Другая возможность «низкого уровня» с использованием 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); } } 

Если однажды вы напишете собственный десериализатор, JsonElement станет вашим лучшим другом.