将Retrofit响应转换为本地模型

时间:2017-12-05 16:42:39

标签: java android rest retrofit retrofit2

我正在使用Retrofit与基于REST的服务进行通信,而在我的Android App中,我有一个本地域模型。为了使我的应用程序与REST服务的任何更改和依赖关系隔离,我想将从REST服务返回的对象转换为我的本地域模型。

目前我通过将response.body()返回的对象传递给模型中相应类的构造函数来实现此目的。这适用于所有基本属性,如整数,字符串等,除了更复杂的对象,如List<>。这是我的班级:

public abstract class MetadataAsset<T> implements Comparable<T> {

    protected Long id;
    protected String title;
    protected String description;
    protected List<String> genres;
    protected List<CastMember> cast;

    public MetadataAsset(no.external.entities.MetadataAsset metadataAsset) {
        this.id = metadataAsset.id;
        this.title = metadataAsset.title;
        this.description = metadataAsset.description;
        this.genres = metadataAsset.genres;

        this.cast = new ArrayList<>();
        if(metadataAsset.cast != null) {
            for (no.external.entities.CastMember castMember : metadataAsset.cast) {
                this.cast.add(new CastMember(castMember));
            }
        }

    }

    public Long getId() {
        return id;
    }

    public String getTitle() {
         return title;
    }

    public String getDescription() {
         return description;
    }

    public List<String> getGenres() {
         return genres;
    }

    public List<CastMember> getCast() {
         return cast;
    }
}

传递给构造函数的对象是由Retrofit返回的response.body()对象。在将此对象传递给MetadataAsset构造函数之前,我检查了强制转换列表的大小是否为空,并且列表中的元素数是&gt; 0,我得到正确数量的元素,但是当我在构造函数中进行相同的测试时,列表现在为空。

查看类型列表,结果不同。在将对象传递给构造函数和构造函数之前,列表具有相同数量的元素。

这里有某种GC,我不明白吗?当它不在外面时,为什么列表在构造函数中是NULL?

这应该如何构建?

1 个答案:

答案 0 :(得分:0)

您不能只使用Serializable并让您选择使用Retrofit的转换器完成工作吗?

例如,在您的代码中,您可以创建自定义对象implement Serializable,然后还可以使用@SerializedName注释对JSON中要映射的字段进行注释,并将json属性名称作为注释的参数,如this

希望这可能有所帮助。