Как проанализировать динамический ключ ответа с помощью модернизации - PullRequest
0 голосов
/ 08 мая 2018

У меня проблема с анализом с использованием модифицированного вызова. это не повторяющийся вопрос. Я пытаюсь слишком много гуглить и пробую много решений, но в моем случае это не работает. поэтому, пожалуйста, не голосуйте против этого вопроса.

Я также делаю уроки pojo, но не понял, как это связать. data.java

public class Data {
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("symbol")
    @Expose
    private String symbol;
    @SerializedName("website_slug")
    @Expose
    private String websiteSlug;
    @SerializedName("rank")
    @Expose
    private Integer rank;
    @SerializedName("circulating_supply")
    @Expose
    private Double circulatingSupply;
    @SerializedName("total_supply")
    @Expose
    private Double totalSupply;
    @SerializedName("max_supply")
    @Expose
    private Double maxSupply;
    @SerializedName("quotes")
    @Expose
    private Quotes quotes;
    @SerializedName("last_updated")
    @Expose
    private Integer lastUpdated;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public String getWebsiteSlug() {
        return websiteSlug;
    }

    public void setWebsiteSlug(String websiteSlug) {
        this.websiteSlug = websiteSlug;
    }

    public Integer getRank() {
        return rank;
    }

    public void setRank(Integer rank) {
        this.rank = rank;
    }

    public Double getCirculatingSupply() {
        return circulatingSupply;
    }

    public void setCirculatingSupply(Double circulatingSupply) {
        this.circulatingSupply = circulatingSupply;
    }

    public Double getTotalSupply() {
        return totalSupply;
    }

    public void setTotalSupply(Double totalSupply) {
        this.totalSupply = totalSupply;
    }

    public Double getMaxSupply() {
        return maxSupply;
    }

    public void setMaxSupply(Double maxSupply) {
        this.maxSupply = maxSupply;
    }

    public Quotes getQuotes() {
        return quotes;
    }

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

    public Integer getLastUpdated() {
        return lastUpdated;
    }

    public void setLastUpdated(Integer lastUpdated) {
        this.lastUpdated = lastUpdated;
    }
}

это quotes.java

public class Quotes {
    @SerializedName("USD")
    @Expose
    private USD uSD;

    public USD getUSD() {
        return uSD;
    }

    public void setUSD(USD uSD) {
        this.uSD = uSD;
    }
    public Map<String, USD> data;

}

это USD.java

public class USD {
    @SerializedName("price")
    @Expose
    private Double price;
    @SerializedName("volume_24h")
    @Expose
    private Double volume24h;
    @SerializedName("market_cap")
    @Expose
    private Double marketCap;
    @SerializedName("percent_change_1h")
    @Expose
    private Double percentChange1h;
    @SerializedName("percent_change_24h")
    @Expose
    private Double percentChange24h;
    @SerializedName("percent_change_7d")
    @Expose
    private Double percentChange7d;

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Double getVolume24h() {
        return volume24h;
    }

    public void setVolume24h(Double volume24h) {
        this.volume24h = volume24h;
    }

    public Double getMarketCap() {
        return marketCap;
    }

    public void setMarketCap(Double marketCap) {
        this.marketCap = marketCap;
    }

    public Double getPercentChange1h() {
        return percentChange1h;
    }

    public void setPercentChange1h(Double percentChange1h) {
        this.percentChange1h = percentChange1h;
    }

    public Double getPercentChange24h() {
        return percentChange24h;
    }

    public void setPercentChange24h(Double percentChange24h) {
        this.percentChange24h = percentChange24h;
    }

    public Double getPercentChange7d() {
        return percentChange7d;
    }

    public void setPercentChange7d(Double percentChange7d) {
        this.percentChange7d = percentChange7d;
    }

}

Это URL.

https://api.coinmarketcap.com/v2/ticker/?limit=0

это ответ.

{
    "data": {
        "1": {
            "id": 1, 
            "name": "Bitcoin", 
            "symbol": "BTC", 
            "website_slug": "bitcoin", 
            "rank": 1, 
            "circulating_supply": 17020150.0, 
            "total_supply": 17020150.0, 
            "max_supply": 21000000.0, 
            "quotes": {
                "USD": {
                    "price": 9334.59, 
                    "volume_24h": 6857290000.0, 
                    "market_cap": 158876121989.0, 
                    "percent_change_1h": 0.12, 
                    "percent_change_24h": -2.28, 
                    "percent_change_7d": 0.55
                }
            }, 
            "last_updated": 1525694372
        }, 
        "1027": {
            "id": 1027, 
            "name": "Ethereum", 
            "symbol": "ETH", 
            "website_slug": "ethereum", 
            "rank": 2, 
            "circulating_supply": 99285221.0, 
            "total_supply": 99285221.0, 
            "max_supply": null, 
            "quotes": {
                "USD": {
                    "price": 733.22, 
                    "volume_24h": 3495650000.0, 
                    "market_cap": 72797909741.0, 
                    "percent_change_1h": 1.21, 
                    "percent_change_24h": -5.64, 
                    "percent_change_7d": 7.02
                }
            }, 
            "last_updated": 1525694355
        }
    }
}

Я пытаюсь использовать модифицированный вызов.

   ArrayList<PriceData> pricedatalist;
    ArrayList<Data> datalistnew;
    ArrayList<Quotes> quoteslist;
    ArrayList<USD> usdlist;

ApiService apiService =
                ApiClient.getClient().create(ApiService.class);

        Call<Data> call = apiService.getChampionData();

        call.enqueue(new Callback<Data>() {
            @Override
            public void onResponse(Call<Data> call, Response<Data> response) {
                dd=response.body();
            }

            @Override
            public void onFailure(Call<Data> call, Throwable t) {
                Log.e("Error",t.getMessage());
            }
        });

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы должны добавить еще один объект POJO выше этого, например:

public class Data {
    @SerializedName("data")
    @Expose
    private Map<String, DataRow> result;
}

Затем просто переименуйте данные класс в DataRow

public class DataRow {
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("symbol")
    @Expose
    private String symbol;
    @SerializedName("website_slug")
    @Expose
    private String websiteSlug;
    @SerializedName("rank")
    @Expose
    private Integer rank;
    @SerializedName("circulating_supply")
    @Expose
    private Double circulatingSupply;
    @SerializedName("total_supply")
    @Expose
    private Double totalSupply;
    @SerializedName("max_supply")
    @Expose
    private Double maxSupply;
    @SerializedName("quotes")
    @Expose
    private Quotes quotes;
    @SerializedName("last_updated")
    @Expose
    private Integer lastUpdated;

    public Integer getId() {
        return id;
    }

}

И после этого у вас не возникает проблем с совершением звонка, например:

Call<Data> call = apiService.getChampionData();
0 голосов
/ 08 мая 2018

Вам необходимо изменить тип тела ответа: Call<Data> call = apiService.getChampionData();

Ответ не может быть проанализирован для анализа одного объекта данных, вместо этого вы должны создать новый объект ответа, например

public class DataResponse { private Map<String, Data> data; }

и назовите его Call<DataResponse> call = apiService.getChampionData();

...