我已经尝试过很多关于GSON的示例和教程,以及如何使用它,例如:
http://www.softwarepassion.com/android-series-parsing-json-data-with-gson/
http://androidsmith.com/2011/07/using-gson-to-parse-json-on-android/
等。
我的问题是我的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"
}
]
我在解析此类数据并将其用于存储目的时遇到了一些困难。
答案 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响应中和您的应用中的字段名称很有意义...