2017-12-05 2 views
0

Retrofitを使用してRESTベースのサービスと通信しています。私のAndroid Appにはローカルドメインモデルがあります。私のアプリケーションをRESTサービスの変更や依存関係から隔離するために、RESTサービスから返されたオブジェクトをローカルドメインモデルに変換したいと思っています。ローカルモデルへのRetrofit応答の変換中にエラーが発生しました

現在、私はresponse.body()によって返されたオブジェクトをモデル内の対応するクラスのコンストラクタに渡すことでこれを行います。これは、int、Stringsなどのすべての基本的なプロパティにはうまく機能しますが、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コンストラクタに渡す前に、キャストリストのサイズがnullでなく、リスト内の要素の数が> 0であり、正しい数の要素を取得していることを確認しますが、コンストラクタ内で同じテストを実行すると、リストは現在nullです。

ジャンルリストを見ると、結果は異なります。リストには、オブジェクトをコンストラクタに渡す前とコンストラクタの内部に同じ数の要素があります。

私は理解できない種類のGCがここにありますか?外部にないときにリストがコンストラクタ内でNULLになるのはなぜですか?

これはどのように構成する必要がありますか?

+0

まあ、空のコンストラクタを作成しようとするかもしれませんが、私はretrofitが常に空のコンストラクタをリクエストすると思います。しかし、エラーを貼り付けることはできますか?それはあなたを助けることがより簡単になります。 – guisantogui

答えて

0

Serializableを使用して、あなたがRet​​rofitで作業するように選択したコンバータに作業をさせていただけませんか?例えば

、あなたのコードでは、あなたのカスタムimplement Serializableオブジェクト行い、その後もあなたがthisのように、注釈へのパラメータとしてJSONの属性名を渡して、それらの上に@SerializedNameアノテーションでJSONからマップするフィールドに注釈を付けることができます。

これは役に立ちます。

関連する問題