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.

Ответы

Ответ 1

Структура 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;
}

Ответ 2

Другая возможность "низкого уровня" с использованием 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 станет вашим лучшим другом.