【问题标题】:Trouble retrieving data from web service using GSON使用 GSON 从 Web 服务检索数据时遇到问题
【发布时间】:2012-09-24 16:15:54
【问题描述】:

我尝试了很多关于 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"
} 

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

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

【问题讨论】:

  • 你尝试了什么?您是否为此定义了一个类并尝试用它调用 gson.fromJson?
  • 我不明白问题出在哪里?
  • 看看link
  • 除非您需要 gson 所做的序列化,否则我认为使用内置的 JSONObject 和 JSONArray 手动解析数据会更容易。
  • @Raphael,我的解决方案不适合您吗?如果是这样,请告诉我,我会尽力提供帮助...

标签: android json gson webservice-client arrays


【解决方案1】:

为了解析您的 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);

您的 2nd JSON 响应有点棘手,因为它是一个数组。问题是你不能简单地这样做:

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

前面的代码失败是因为Java由于type erasure而无法知道List&lt;Item&gt;的类。

所以你必须这样做:

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 或任何其他 conictive 类型。无论如何,如果您想直接解析日期,我认为您可以在Gson's User Guide 之后使用 Custom Deserializer


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多