【问题标题】:Retrofit: Parsing JSON to multiple Java objects using GSON改造:使用 GSON 将 JSON 解析为多个 Java 对象
【发布时间】:2015-06-23 20:20:49
【问题描述】:

我正在尝试创建 Photo 对象的 Photos ArrayList。我想将 Photo 类与 Photos 类分开,因为它变得不可读。问题是我不再获取任何数据

值得注意的是,当我将 Photo 类嵌套在 Photos 类中时,这个 WAS 工作如下:

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 完全匹配,我通过以下响应收到了一个数组列表:

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,当有内部班级时,我需要跳过一些障碍。任何指导将不胜感激!谢谢。

编辑:这是 JSON 负载:

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

【问题讨论】:

  • 您可以发布您想要反序列化的 JSON(示例正文)吗?
  • 我不知道你在问什么。你是说当你删除你的内部嵌套类时你认为 Gson 停止了正确的反序列化?
  • 没错。它以前可以工作(如上面带有嵌套照片的照片类中所述),但我将照片类移到它自己的类中并且它停止工作。这可能是一个教育问题。
  • 还有别的问题。 Gson 不在乎它是否是内部类。对不起...

标签: java android json gson retrofit


【解决方案1】:

原来我在命名约定上犯了一个错误:

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

我已将 arrayList 上的 photo 重命名为 mPhotos,但忘记了 GSON 需要 JSON 字段的确切名称(最初是 photo)。我将它改回“照片”,现在 arrayList 填充在我的照片对象上。

我需要向自己强调,所有字段都必须符合 JSON 命名约定。

谢谢。

【讨论】:

  • 或者你可以使用 SerializedName 注解来为你想要的字段命名。
【解决方案2】:

使用 Retrofit 和 GSON 时,无法将您的响应“分离”到不同的类中,您必须稍后自己进行。接收包含所有信息的大对象,然后将其解包到所需的类。

在我做的一个项目中,我有一个带有 Wrapper 类的特定包来从 Retrofit 获得响应,然后我会手动将它映射到我实际需要的对象。希望对您有所帮助。

【讨论】:

  • 您应该已经定义了自己的 TypeAdapter。不要仅仅因为 API 响应与您的 pojo 不匹配而创建 Java 对象。
  • 老实说,我发现创建 Wrapper 类比编写自定义适配器更容易。
  • 这是您必须拨打的电话。制作包装类会增加代码复杂性和低效率,但编写自定义 TypeAdapter 最初需要更多开发时间。
  • 增加代码复杂性和低效率?告诉我更多关于那个
  • 代码复杂度:你自己说的。这是一个包装。您没有为代码的用例制作理想的 Java 对象,因为您正在使其适合 JSON 有效负载。低效率:Java 对象不是廉价的分配。如果您真的只需要一个 Java 对象来定义您的数据,那么当您将它分成三个对象并扩展到数千个对象时,这会很麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多