如何使用改进来解析动态密钥响应

时间:2018-05-08 06:28:58

标签: android retrofit2 jsonparser

我在使用改装调用解析时遇到问题。这不是重复的问题。我尝试了太多的谷歌搜索也尝试了很多解决方案但它在我的情况下不起作用。所以请不要投票这个问题。

我也制作了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;
    }

}

这是网址。

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 :(得分:4)

您需要更改Call<Data> call = apiService.getChampionData();

的响应正文类型

无法解析响应以解析一个Data对象,而应创建一个新的响应对象,如

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

并将其称为Call<DataResponse> call = apiService.getChampionData();

答案 1 :(得分:1)

您需要在此上面再添加一个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();