Intereting Posts
Android adb над Wifi install apk Как использовать «репо» для клонирования минимального источника андроида? Переключение между фрагментами с помощью функции OnNavigationItemSelected в новом шаблоне активности навигационного ящика (Android Studio 1.4) Как получить данные из DialogFragment в фрагмент? Android WebView setCertificate выдает проблемы с SSL Скрытые фрагменты backstack, повторно отображаемые при изменении конфигурации Не влияет ли вектор Android «Вектор вращения игры» на вращение вокруг вертикальной оси? Нужно ли каждому новому виду создавать новые макеты? Андроидный проход с поиском Couchbase lite на Android – общая архитектура? Просмотр пути к файлу в файловом менеджере с намерением Android Класс приложения работает в потоке пользовательского интерфейса или? Android CardView со странной границей при прозрачности Привязка данных Android, значение атрибута «android: text», связанное с типом элемента «TextView», не должно содержать символ «<» Как уменьшить внутреннюю прописку вокруг текста в объекте кнопки Android?

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 станет вашим лучшим другом.