GSON:期待一个字符串,但是BEGIN_OBJECT?

时间:2012-07-20 00:52:57

标签: android json gson

我尝试使用GSON来解析一些非常简单的JSON。这是我的代码:

    Gson gson = new Gson();

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

这里是从网址返回的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的新手。

3 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:4)

使用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将是你最好的朋友。

答案 2 :(得分:0)

当Pojo键数据类型不同于json响应时,这是正常的解析异常

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

例如

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

由于api提供的响应而导致出现相同的错误,

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

此处POJO为outputParameters为字符串,但根据api响应,其为json