无法使用GSON从Web服务检索数据

时间:2012-09-24 16:15:55

标签: android json gson webservice-client arrays

我已经尝试过很多关于GSON的示例和教程,以及如何使用它,例如:

等。

我的问题是我的http://localhost:3000/users/1.json返回了这个json值,即:

{
  "created_at": "2012-09-20T01:43:15Z",
  "id": 1,
  "name": "kevin",
  "updated_at": "2012-09-20T01:43:15Z"
} 

另一个是在此网址http://localhost:3000/users.json中,其具有json值

[ {
    "created_at": "2012-09-20T01:43:15Z",
    "id": 1,
    "name": "kevin",
    "updated_at": "2012-09-20T01:43:15Z"
  }, {
    "created_at": "2012-09-20T01:43:33Z",
    "id": 2,
    "name": "pineda",
    "updated_at": "2012-09-20T01:43:33Z"
  }, {
    "created_at": "2012-09-20T01:46:08Z",
    "id": 3,
    "name": "raphael",
    "updated_at": "2012-09-20T01:46:08Z"
  }, {
    "created_at": "2012-09-20T16:13:42Z",
    "id": 4,
    "name": null,
    "updated_at": "2012-09-20T16:13:42Z"
  }, {
    "created_at": "2012-09-20T16:18:03Z",
    "id": 5,
    "name": null,
    "updated_at": "2012-09-20T16:18:03Z"
  }, {
    "created_at": "2012-09-20T16:19:23Z",
    "id": 6,
    "name": null,
    "updated_at": "2012-09-20T16:19:23Z"
  }, {
    "created_at": "2012-09-20T16:20:41Z",
    "id": 7,
    "name": null,
    "updated_at": "2012-09-20T16:20:41Z"
  } 
]

我在解析此类数据并将其用于存储目的时遇到了一些困难。

1 个答案:

答案 0 :(得分:2)

为了解析您的JSON,您首先需要创建一个类来包装您的数据。在你的情况下:

public class Item {
  @SerializedName("created_at")
  private String createdAt;
  @SerializedName("id")
  private int id;
  @SerializedName("name")
  private String name;
  @SerializedName("updated_at")
  private String updatedAt;
  //getters and setters
}

然后,为了解析您的第一次 JSON响应,您只需执行以下操作:

Gson gson = new Gson();
Item item = gson.fromJson(your1stJsonString, Item.class);

你的第二次 JSON响应有点棘手,因为它是一个数组。问题是你不能简单地做:

List<Item> item = gson.fromJson(your1stJsonString, List<Item>.class); //wrong!

之前的代码失败,因为Java无法知道由type erasure引起的List<Item>类。

所以你必须这样做:

Type itemListType = new TypeToken<List<Item>>() {}.getType();
List<User> itemList = gson.fromJson(your2stJsonString, itemListType);

就是这样,一旦你在对象(或对象列表)中解析了JSON响应,就可以像往常一样访问所有检索到的数据:

String name = itemList.get(i).getName();

注1 :请注意,我已将属性的类型created_at和updated_at设置为String,因为它使事情变得更容易。我通常这样做,然后我解析Date或任何其他 confictive 类型。无论如何,如果你想直接解析日期,我认为你可以在Gson's User Guide之后使用自定义反序列化器


Note2 :为了遵循Java命名约定,使用注释@SerializedName对于分离JSON响应中和您的应用中的字段名称很有意义...