Android json错误com.google.gson.JsonSyntaxException:java.lang.IllegalStateException

Android json错误com.google.gson.JsonSyntaxException:java.lang.IllegalStateException,android,json,gson,Android,Json,Gson,我在解析json数据时遇到了这个错误 Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 Type type = new TypeToken<List<WorkItem>>() { }.getType(); List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type); 我找不到

我在解析json数据时遇到了这个错误

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2
Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
我找不到解决办法。我的json数据是:

{
  "user": [
    {
      "email": "wijden@jerseyrest.com",
      "firstName": "Wijden",
      "id": "1",
      "lastName": "User"
    }, {
      "email": "user@jerseyrest.com",
      "firstName": "Sample",
      "id": "2",
      "lastName": "User"
    }, {
      "email": "ingenieur@jerseyrest.com",
      "firstName": "Ingenieur",
      "id": "3",
      "lastName": "User"
    }
  ]
}
Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
我就是这样做的:

Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
Type Type=new-TypeToken(){}.getType();
List workitems=(List)new Gson().fromJson(resultat,type);

如果你能帮我解决这个问题,我将不胜感激。当您尝试解析一个集合时,如Gson所期望的,您将拥有一个JSON数组(如错误消息所述),而不是一个对象,请提前感谢。JSON是一个包含数组(对象数组)的对象

Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
要解析它,您需要一个Java对象,该对象的类型为集合。或者,您需要将json更改为一个数组,或者您可以创建一个自定义序列化器/反序列化器(或者想出一些其他技巧,但底线是您的json目前不是一个数组)

Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
尝试更改解析到的Java对象,以便快速修复:

Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
public class WorkItemsContainer {
  private List<WorkItem> workItems;
  //getters/setters/ctor/etc
}
公共类工作项容器{
私有列表工作项;
//getter/setter/ctor/etc
}

请参阅此处的Gson文档“with objects”部分:。

为了解析JSON,我将创建类来包装响应,即:

Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
public class Response {
  @SerializedName("user")
  private List<User> userList;
  //getters and setters
}
然后,为了解析JSON响应,您只需执行以下操作:

Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
Gson gson = new Gson();
Response data = gson.fromJson(yourJsonString, Response.class);
然后,您可以非常轻松地访问数据,如:

Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);
User user = data.getUserList.get(i);

注意:注释
@SerializedName
的使用有助于在JSON响应和应用程序中分隔字段名称,以便遵循Java命名约定…

JSONLint是您的朋友:。在这种情况下,剪切/粘贴的三条线是有效的。所以问题是“其他东西”。问:你能提供更多的代码吗?问:你能不能把事情分解成几个额外的子变量,而不是用“new Gson().fromJson()”?谢谢你的回答,注释@SerializedName非常有趣,但我在Jersey上使用REST Web服务,它使用jackon而不是Gson任何其他解决方案?我不明白你的意思。。。我的解决方案不会修改web服务中的任何内容!这正是你必须在你的应用程序中编写的内容来解析你得到的JSON响应。。。您正在使用GSON,因为在您的代码中有
new GSON()
,您用GSON标记了您的问题…真的吗?我编辑了代码,因为我把
firstName
写成
int
,它是一个
字符串
。。。但我正在用您提供的JSON响应运行这段代码,它对我来说非常适合。。。你确定你得到的是同样的异常吗?或者可能是因为我在
private int firstName
中指出的错误导致我出错?很抱歉,我还有一个错误,那就是java.lang.ClassCastException:com.client.android.model.WorkItemContainer无法转换为java.util.List,并且应用程序正在显示一个没有正确信息的列表您在使用
WorkItemContainer
上课?这不在我的解决方案中。。。我建议你按照我的方法和新问题的所有细节,用更新后的代码打开一个新问题,我会尽力帮助你。。。
Type type = new TypeToken<List<WorkItem>>() { }.getType();
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type);