2015-06-23 4 views
1

Я пытаюсь создать объект фотографий ArrayList of Photo. Я хочу отделить класс Photo от класса Photos, потому что он становится нечитаемым. Проблема не в том, что я больше не получаю никаких данных обратноМодернизация: Разбор JSON для нескольких объектов Java с использованием GSON

Стоит отметить, что это работает, когда у меня был класс фото вложенной в фотографиях класса следующим образом:

public class Photos { 
    @Expose private int page; 
    @Expose private int pages; 
    @Expose private int perpage; 
    @Expose private String total; 
    @Expose private ArrayList<Photo> photo = new ArrayList<Photo>(); 

    //helpers 
    public ArrayList<Photo> getPhotos(){return photo;} 
    public void setPhotos(ArrayList<Photo> photos){this.photo = photos;} 

//want to put this in it's own class 
public class Photo { 
    //helpers 
    @Override 
    public String toString(){ 
     return title; 
    } 
    public String getUrl(){return url_s;} 

    //GSON fields 
    @Expose private String id; 
    @Expose private String owner; 
    @Expose private String secret; 
    @Expose private String server; 
    @Expose private int farm; 
    @Expose private String title; 
    @Expose private int ispublic; 
    @Expose private int isfriend; 
    @Expose private int isfamily; 
    @Expose private String url_s; 
} 

}

Переоборудование:

new Callback<PhotosResponse>() { 
        @Override 
        public void success(PhotosResponse photosResponse, Response response) { 
        bus.post(new ImagesReceivedEvent(photosResponse.getPhotosObject().getPhotos())); 
       } 

параметры соответствовали JSON точно, и я получил ArrayList через следующий ответ:

public class ImagesReceivedEvent { 

    private ArrayList<Photo> result; 

    public ImagesReceivedEvent(ArrayList<Photo> result){ 
     Log.i(TAG, "arraylist for presenter"); 
     this.result = result; 
    } 

    public ArrayList<Photo> getResult(){return result;} 
} 

Это где был получен ответ, но не больше:

public class PhotosResponse { 

    @Expose private Photos photos; 
    @Expose private String stat; 

    public Photos getPhotosObject(){return photos;} 

    public void setPhotosObject(Photos photos) { 
     this.photos = photos; 
    } 

    public String getStat() { 
     return stat; 
    } 

    public void setStat(String stat) { 
     this.stat = stat; 
    } 
} 

Как я могу разделить эти классы и до сих пор получить ArrayList в качестве ответа? Я хочу разделить их, потому что я планирую использовать Parcelable для каждого класса, есть некоторые препятствия, которые мне нужно будет перепрыгнуть при наличии внутреннего класса. Любое руководство будет высоко оценено! Благодарю.

Edit: Вот JSON полезной нагрузки:

{ "photos": { "page": 1, "pages": 10, "perpage": 100, "total": "1000", 
"photo": [ 
    { "id": "18473086614", "owner": "[email protected]", "secret": "b3c684c356", "server": "259", "farm": 1, "title": "My travels circa 2013. Summer days on #charlesbridge #charlesbridgeprague #prauge. [email protected] || 718-754-5850 #photographer #photography #canonphotography #canon #canondslr #canon600d #dslr #600d #travelphotography #europe #upboundonline #canonre", "ispublic": 1, "isfriend": 0, "isfamily": 0 }, 
    { "id": "18473090744", "owner": "[email protected]", "secret": "2734055852", "server": "3705", "farm": 4, "title": "Untitled", "ispublic": 1, "isfriend": 0, "isfamily": 0 }, 
    { "id": "18473091934", "owner": "[email protected]", "secret": "b40dbfcf15", "server": "401", "farm": 1, "title": "Climbing Acatenango", "ispublic": 1, "isfriend": 0, "isfamily": 0 }, 
    { "id": "18473092714", "owner": "[email protected]", "secret": "e51f5a183b", "server": "3936", "farm": 4, "title": "DSCF1735.jpg", "ispublic": 1, "isfriend": 0, "isfamily": 0 } 
] }, "stat": "ok" } 
+0

Можете ли вы разместить JSON (пример тела), который вы хотите десериализовать? –

+0

Я не могу сказать, что вы просите. Вы говорите, что считаете, что Gson прекратил десериализацию правильно, когда вы удаляете свой внутренний вложенный класс? –

+0

Точно. Он работал раньше (как описано в вышеприведенном классе фотографий с вложенной фотографией), но я переместил класс фотографии в свой класс и прекратил работу. Это может быть проблема образования. – Futureproof

ответ

0

При использовании Дооснащение и GSON нет никакого способа, чтобы «отдельные» ваш ответ на различные классы, вы должны позже сделать это самостоятельно. Получите свой большой объект со всей информацией, а затем разверните его в нужные классы.

В проекте у меня был специальный пакет с классами Wrapper для получения ответов от Retrofit, а затем я вручную сопоставлял его с объектами, которые мне действительно нужны. Надеюсь, поможет.

+0

Вы должны были определить свой собственный адаптер TypeAdapter. Не создавайте объекты Java только потому, что ответ API не соответствует вашим pojos. –

+0

Я честно считаю, что проще создавать классы Wrapper вместо написания пользовательского адаптера. –

+0

Это звонок, который вы должны сделать. Создание классов-оболочек добавляет сложность кода и неэффективность, но при написании пользовательского TypeAdapter требуется больше времени на dev. –

1

Оказывается, что я сделал ошибку на именовании:

@Expose private ArrayList<Photo> mPhotos = new ArrayList<Photo>(); 

Я переименовал фото в mPhotos на ArrayList, но забыл, что GSON нужны ТОЧНЫЕ имена полей в формате JSON (который изначально фото). Я изменил его на «фото», и теперь массивList заполняет объект «Мои фотографии».

Мне нужно подчеркнуть, что все поля ДОЛЖНЫ соответствовать соглашению об именах JSON.

Спасибо.

+0

Или вы можете использовать аннотацию SerializedName, чтобы назвать поле, как хотите. – guydemossyrock