2017-02-16 7 views
-3

Retrofitを使用して、換算レートremote APIからデータを取得しようとしています。JSON、Retrofit 2、Android用コンバータ

arraylistを返す方法を尋ねることはありません... arraylistを返すか、Retrofitコンバータを使用する方が良いかどうか、そして改造コンバータがこのような状況に適しているかどうかを知りたいだけです。

{ 
    "success": true, 
    "terms": "https://currencylayer.com/terms", 
    "privacy": "https://currencylayer.com/privacy", 
    "timestamp": 1487243354, 
    "source": "USD", 
    "quotes": { 
    "USDAED": 3.672503, 
    "USDAFN": 66.599998, 
    "USDALL": 127.501996, 
    "USDAMD": 486.119995, 
    "USDANG": 1.769648, 
    "USDAOA": 165.082001, 
    "USDARS": 15.37279, 
    "USDAUD": 1.299101, 
    "USDAWG": 1.8017, 
    "USDAZN": 1.729104, 
    "USDBAM": 1.842499, 
    "USDBBD": 2, 
    "USDBDT": 79.249746, 
    "USDBGN": 1.853047, 
    ... 
    } 
} 

私はJSONデータから私のオブジェクトを作成するには、このウェブサイトjsonschema2pojoを使用:このAPIは、私にこのようにフォーマットされたJSONを返す

。それは私に2つのクラスExampleQuotesを作成しました。このような私のQuotesクラスの外観は:

public class Quotes { 

    @SerializedName("USDAED") 
    @Expose 
    private Double uSDAED; 
    @SerializedName("USDAFN") 
    @Expose 
    private Double uSDAFN; 
    @SerializedName("USDALL") 
    @Expose 
    private Double uSDALL; 
    @SerializedName("USDAMD") 
    @Expose 
    private Double uSDAMD; 
    @SerializedName("USDANG") 
    @Expose 
    private Double uSDANG; 
    @SerializedName("USDAOA") 
    ... 
} 

Exampleクラスでは唯一の引用はすべて引用符でオブジェクトを返すQuotesと呼ばれるgetQuotesを()を取得する一つの方法が含まれています。それから、私は交換レートを得るために私のQuotesクラスのgetter()を呼び出さなければなりません。私はリスト内のすべての引用符を返し、すべてのgetterを呼び出す必要はありません...私はこれを簡単に私のExampleクラスまたは異なる方法。とにかくこれを行う最良の方法が何であるかを知りたいのですが、私は良い習慣の観点から、Dagger 2でMVPアーキテクチャを使用しています。Retrofitを使用したカスタムコンバータについて聞いたことがあります。 ?ちなみに、Retrofitカスタムコンバーターについてのリンクが分かれば分かりやすいリンクがあれば教えてください...私はこのプロジェクトを教育目的でやっていますので、別のAPIを私に提案してはいけません。このAPIを使用します。

public class Example { 

    @SerializedName("success") 
    @Expose 
    private Boolean success; 
    @SerializedName("terms") 
    @Expose 
    private String terms; 
    @SerializedName("privacy") 
    @Expose 
    private String privacy; 
    @SerializedName("timestamp") 
    @Expose 
    private Integer timestamp; 
    @SerializedName("source") 
    @Expose 
    private String source; 
    @SerializedName("quotes") 
    @Expose 
    private Quotes quotes; 

    public Boolean getSuccess() { 
     return success; 
    } 

    public void setSuccess(Boolean success) { 
     this.success = success; 
    } 

    public String getTerms() { 
     return terms; 
    } 

    public void setTerms(String terms) { 
     this.terms = terms; 
    } 

    public String getPrivacy() { 
     return privacy; 
    } 

    public void setPrivacy(String privacy) { 
     this.privacy = privacy; 
    } 

    public Integer getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(Integer timestamp) { 
     this.timestamp = timestamp; 
    } 

    public String getSource() { 
     return source; 
    } 

    public void setSource(String source) { 
     this.source = source; 
    } 

    public Quotes getQuotes() { 
     return quotes; 
    } 

    public void setQuotes(Quotes quotes) { 
     this.quotes = quotes; 
    } 

} 
+0

あまりにもあなたの例のクラスを投稿してください。 –

+1

引用符内のすべてのエントリがarrayListとして必要な場合は、引用符オブジェクトを文字列のarrayListに変更するだけです。私はあなたのJSON構造の再構築について話しています。あなたはカスタムアダプタや何かを必要としないでしょう。 – Dibzmania

+0

それは*文字列の配列リスト*マップではありません – Selvin

答えて

0

誰もレトロフィットコンバータについて私に答えていないので、私は最終的に、最も簡単な解決策になってしまったと私は私の質問は愚かだったと思い票を下に持っていました。

後でクラスに追加情報を追加したい場合に備えて、私はHashMapではなくカスタムQuoteクラスを使用しました。

public class Quotes { 

    @SerializedName("USDAED") 
    @Expose 
    private Double uSDAED; 
    @SerializedName("USDAFN") 
    @Expose 
    private Double uSDAFN; 
    @SerializedName("USDALL") 
    @Expose 
    private Double uSDALL; 
    ... 
    public List<Quote> getAllQuotes() { 
     List<Quote> allQuotes = new ArrayList<>(); 

     allQuotes.addAll(Arrays.asList(
       new Quote("USDAED", new BigDecimal(uSDAED, MathContext.DECIMAL32)), 
       new Quote("USDAFN", new BigDecimal(uSDAFN, MathContext.DECIMAL32)), 
       new Quote("USDALL", new BigDecimal(uSDALL, MathContext.DECIMAL32)), 
       new Quote("USDAMD", new BigDecimal(uSDAMD, MathContext.DECIMAL32)), 
     ... 
     new Quote("USDZMW", new BigDecimal(uSDZMW, MathContext.DECIMAL32))) 

     ); 
     return allQuotes; 
    } 
    ... 
} 

MainActivity.java

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ((App) getApplication()).getComponent().inject(this); 

     String apiKey = getResources().getString(R.string.API_KEY); 
     Call<Example> call = apiLayerForexAPI.getQuotes(apiKey); 

     call.enqueue(new Callback<Example>() { 
      @Override 
      public void onResponse(Call<Example> call, Response<Example> response) { 
       List<Quote> allQuotes = response.body().getQuotes().getAllQuotes(); 
       for(Quote q : allQuotes){ 
        Log.d(LOG_TAG, q.toString()); 
       } 

      } 
      @Override 
      public void onFailure(Call<Example> call, Throwable t) { 
       t.printStackTrace(); 
      } 
     }); 
    } 
関連する問題