2012-01-16 3 views
2

Я делаю запрос на freebase и получаю ответ JSON. Реакция имеет следующую структуру:Застрял при разборе ответа JSON на Java-объект в Android

{ 
    "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 объектов ява с использованием 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; 
    } 
} 

ответ

0

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

+0

Кажется, теперь работает, я обновил qestion своим решением на основе вашего ответа. Спасибо. – Alin

0

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

+0

Проблема заключается в создании соответствующего класса ... – Alin