Intereting Posts
Как создать контрольную сумму MD5 для файла в Android? Команда SharedPreferences Editor занимает так много времени Анимация режимов видимости, GONE и VISIBLE Неравномерное количество образцов между акселерометром, гироскопом и магнитометром на Android Google Maps Android, обнаружение взаимодействия с пользователем в карте местоположения Android ListView CHOICE_MODE_MULTIPLE, как установить проверенный индекс? Кнопки действий не отображаются в ActionBar Автоматически устанавливать положение индикатора табуляции в библиотеке поддержки TabLayout Не удалось получить правильное значение xy в onTouch Android – сравнение строк между двумя именами версий Android Facebook на android: не удалось войти в систему после закрытияAndClearTokenInformation Обнаружение паттерна движения на устройстве Android Как получить количество спутников, используемых в gps в android? HTTP-запросы с базовой аутентификацией Android webView: возможно установить клавиатуру чисел по умолчанию при использовании типа ввода = текст

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.

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