1

我已经尝试了很多关于 GSON 的示例和教程以及使用它的工作原理,例如:

等等。

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

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

另一个在这个 urlhttp://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"
  } 
]

我很难解析这些数据并将其用于存储目的。

4

1 回答 1

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!

List<Item>前面的代码失败是因为 Java由于类型擦除而无法知道 的类。

所以你必须这样做:

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 属性的类型设置为 just String,因为它使事情变得更容易。我通常这样做,然后我解析Date或任何其他conictive类型。无论如何,如果您想直接解析日期,我认为您可以按照Gson's User Guide使用自定义反序列化器


注意2:注释的使用@SerializedName很有趣,可以将 JSON 响应和应用程序中的字段名称分开,以遵循 Java 命名约定......

于 2013-04-20T20:44:20.333 回答