Проблема с получением данных из веб-службы с помощью GSON

Я пробовал много примеров и руководств по GSON и тому, как с ним работать, например:

и так далее.

Моя проблема в том, что у меня есть это значение 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"
} 

Другой находится в этом 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"
  } 
]

Мне немного сложно анализировать такие данные и получать их для хранения.


person Raphael Pineda    schedule 24.09.2012    source источник
comment
Что вы пробовали? Вы определили для этого класс и пытались вызвать с ним gson.fromJson?   -  person maaartinus    schedule 24.09.2012
comment
я не понимаю где проблема?   -  person njzk2    schedule 24.09.2012
comment
взгляните на ссылку   -  person SquiresSquire    schedule 09.10.2012
comment
если вам не нужна сериализация, которую делает gson, я думаю, что проще просто вручную проанализировать данные, используя встроенные JSONObject и JSONArray.   -  person toadzky    schedule 09.10.2012
comment
@ Рафаэль, разве мое решение не работает для тебя? Если да, дайте мне знать, и я постараюсь помочь...   -  person MikO    schedule 25.04.2013
comment
О, я забыл сказать спасибо, это сработало!   -  person Raphael Pineda    schedule 25.04.2013


Ответы (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
}

Затем, чтобы проанализировать ваш 1st ответ JSON, вам просто нужно сделать:

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

Ваш второй ответ JSON немного сложнее, потому что это массив. Проблема в том, что вы не можете просто сделать:

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

Предыдущий код дает сбой, потому что Java не может знать класс List<Item> из-за < strong>введите стирание.

Итак, вы должны сделать это следующим образом:

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 или любой другой конфективный. В любом случае, если вы хотите напрямую анализировать даты, я думаю, вы можете использовать Пользовательский десериализатор после Руководство пользователя Gson.


Примечание 2. Использование аннотации @SerializedName интересно для разделения имени поля в ответе JSON и в вашем приложении, чтобы следовать соглашениям об именах Java...

person MikO    schedule 20.04.2013