Hasu Sarkar
Hasu Sarkar

Reputation: 59

how to parse dynamic key response using retrofit

I am facing issue with parsing using retrofit call. this not duplicate question . I try too much googling also try many solution but it doesn't work in my case. so please do not down vote this question.

I also make pojo classes but didn't get how to bind that. 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;
    }
}

this is 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;

}

this is 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;
    }

}

This is Url.

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

this is response.

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

I try using retrofit call.

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

Upvotes: 1

Views: 2236

Answers (2)

jantursky
jantursky

Reputation: 1130

You need to add one more POJO object above this, like this:

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

Then just rename your Data class to 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;
    }

}

And after that, you haven't any problems to make call just like this:

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

Upvotes: 2

H. Ekici
H. Ekici

Reputation: 199

You need to change the response body type of Call<Data> call = apiService.getChampionData();

The response cannot be parsed to parsed one Data object, instead you should create a new response object like

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

and call it Call<DataResponse> call = apiService.getChampionData();

Upvotes: 5

Related Questions