2017-02-16 29 views
-3

Я пытаюсь использовать Retrofit для получения данных по обменному курсу remote API.JSON, Retrofit 2 и конвертеры на Android

Для большей точности я не спрашиваю, как вернуть arraylist ... Я просто хочу знать, лучше ли возвращать arraylist или использовать преобразователь Retrofit, и если модифицированный конвертер подходит к подобной ситуации.

Этот API возвращает мне JSON, отформатированный как это:

{ 
    "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, 
    ... 
    } 
} 

Я использовал этот сайт jsonschema2pojo создать свой объект из данных в формате JSON. Он создал меня двумя классами Example и Quotes. Мой 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(), возвращающей Котировки объекта со всеми кавычками. Затем я должен вызвать getter() моего класса Quotes, чтобы получить обменный курс. Дело в том, что я хотел бы иметь методы, которые возвращают мне все кавычки в списке и не должны вызывать все геттеры ... Конечно, я могу сделать это, легко модифицируя метод в моем классе Example или в другом другом путь. В любом случае, я хотел бы знать, что было бы лучшим способом сделать это, я имею в виду хорошую практику, я использую MVP-архитектуру с Dagger 2. Я слышал о настраиваемом конверторе с 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

это не может быть * arrayList строки * это карта – Selvin

ответ

0

я, наконец, закончил с самым простым решением, так как никто не ответил мне о Retrofit преобразователе, и я был вниз голос я думаю, мой вопрос был глуп.

Я использовал специальный класс Quote вместо HashMap на всякий случай, если хочу добавить дополнительную информацию в свой класс позже.

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(); 
      } 
     }); 
    }