20

非常に単純な JSON を解析するために GSON を使用しようとしています。これが私のコードです:

    Gson gson = new Gson();

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

URL から返される JSON は次のとおりです。

{
  "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初心者です。

4

3 に答える 3

27

JSON 構造は、「access_token」という名前の 1 つの要素を持つオブジェクトであり、単純な文字列ではありません。次のように、Map などの一致する 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);
  }
}

もう 1 つの一般的なアプローチは、JSON に一致するより具体的な Java データ構造を使用することです。例えば:

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;
}
于 2012-07-20T01:25:40.893 に答える
5

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 が最適です。

于 2013-11-13T22:40:32.820 に答える