【问题标题】:GSON: Expected a string but was BEGIN_OBJECT?GSON:期望一个字符串,但是是 BEGIN_OBJECT?
【发布时间】:2012-07-20 00:52:56
【问题描述】:

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

【问题讨论】:

    标签: android json gson


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 我很抱歉打了一个旧线程,Json 新手,你能简单解释一下你的第一个答案吗,我对将 Map 放入类型令牌感到困惑..对 fromJson( ) 方法
    【解决方案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 将是您最好的朋友。

    【讨论】:

    • 泰。我正在做这种确切的事情,需要这种确切的解决方案。
    【解决方案3】:

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

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

    例如

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多