20

我正在尝试使用 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 的新手。

4

3 回答 3

27

JSON 结构是一个包含一个名为“access_token”的元素的对象——它不仅仅是一个简单的字符串。可以将其反序列化为匹配的 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;
}
于 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 回答
0

这是 Pojo 键数据类型与 json 响应不同时发生的正常解析异常

这是由于 Pojo 类中的数据类型不匹配,实际上是网络 api 响应中的数据

例如

data class ProcessResponse(
        val outputParameters: String,
        val pId: Int 
    )

由于 api 给出了相同的错误响应

 {
        "pId": 1",
        "outputParameters": {
          "": ""
        }
    }

这里 POJO 是 outputParameters 是 String 但根据 api 响应它的 json

于 2020-07-07T19:00:05.957 回答