GSONを使用して非常に単純なJSONを解析しようとしています。これが私のコードです:
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は初めてです。
JSON構造は、「access_token」という名前の1つの要素を持つオブジェクトです。これは単なる文字列ではありません。次のように、一致するJava Mapなどのデータ構造に逆シリアル化できます。
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);
}
}
別の一般的なアプローチは、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;
}
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はあなたの親友になります。