Застрял в разборе ответа JSON на Java-объект в Android - PullRequest
2 голосов
/ 16 января 2012

Я делаю запрос на запрос freebase и получаю ответ JSON. Ответ имеет следующую структуру:

{
  "code":          "/api/status/ok",
  "result": [
    {
      "/common/topic/image": [{
        "guid": "#9202a8c04000641f8000000004b67f6d"
      }],
      "/people/person/profession": [{
        "name": "Critic"
      }],
      "id":   "/en/michael_jackson_1942",
      "name": "Michael Jackson",
      "type": "/people/person"
    },  
    {
      "/common/topic/image": [{
        "guid": "#9202a8c04000641f800000001b90fdea"
      }],
      "/people/person/profession": [{
        "name": "Actor"
      }],
      "id":   "/en/michael_jackson_1970",
      "name": "Michael Jackson",
      "type": "/people/person"
    }
  ],
  "status":        "200 OK",
  "transaction_id": "cache;cache03.p01.sjc1:8101;2012-01-16T18:28:36Z;0055"
}

Мне нужно проанализировать этот ответ в ArrayList объектов Java, используя GSON. Для этого мне нужно создать класс объекта с помощью get / set и сделать его доступным для разбора. Или есть еще один простой способ сделать что-то? Я уже использовал простые строки JSON, но в этом случае я не могу переделать структуру нужного мне класса. В конце концов мне нужно что-то вроде ArrayList<Person>, где Person имеет все атрибуты из строки json.

Любая помощь приветствуется. Спасибо.

Окончательное решение, согласно ответу ниже

public class FreebaseResponse {
    @SerializedName("code")
    public String code;

    @SerializedName("result")
    public ArrayList<Person> result;

    @SerializedName("status")
    public String status;

    @SerializedName("transaction_id")
    public String transaction_id;
}

public class Person {
    @SerializedName("/common/topic/image")
    public ArrayList<Person.Guid> imageGuid;

    @SerializedName("/people/person/profession")
    public  ArrayList<Person.Profession> profession;

    @SerializedName("id")
    public String id;

    @SerializedName("name")
    public String name;

    @SerializedName("type")
    public String type;

    private class Guid
    {
        @SerializedName("guid")
        public String guid;
    }

    private class Profession
    {
        @SerializedName("name")
        public String name;
    }
}

Ответы [ 2 ]

0 голосов
/ 16 января 2012

Полагаю, вы можете создать класс FreebaseResponse, содержащий поля code, result (ArrayList<Person>) и т. Д., И использовать Gson для десериализации.names, которые не являются допустимыми идентификаторами, например, /common/topic/image будет проблемой.Я сам не пробовал, но мне кажется, что аннотация SerializedName должна помочь.

0 голосов
/ 16 января 2012

Если вам нужны все поля, то путь, который вы упомянули, кажется мне подходящим. Если вам нужна только небольшая часть данных, вы можете получить их напрямую. В общем, я думаю, что, поскольку JSON предназначен для представления объектов, лучше создать соответствующий класс. Это облегчит ваш путь и в будущем, так как вам понадобятся дополнительные данные.

...