简体   繁体   English

映射使用RxJava和Retrofit获得的嵌套JSON响应

[英]Mapping a nested JSON response obtained using RxJava and Retrofit

I starting out with RxJava and Retrofit and wanted to create a simple app to show a list of 100 cryptocurrencies. 我从RxJava和Retrofit开始,想要创建一个简单的应用程序以显示100种加密货币的列表。

I am making an api call which results in something like this : 我正在进行api调用,结果如下所示:

{
    "Response": "Success",
    "Message": "Coin list succesfully returned!",
    "BaseImageUrl": "https://www.cryptocompare.com",
    "BaseLinkUrl": "https://www.cryptocompare.com",
    "Data": {
        "LTC": {
            "Id": "3808",
            "Url": "/coins/ltc/overview",
            "ImageUrl": "/media/19782/ltc.png",
            "Name": "LTC",
            "CoinName": "Litecoin",
            "FullName": "Litecoin (LTC)",
            "Algorithm": "Scrypt",
            "ProofType": "PoW",
            "SortOrder": "2"
        }
        ...
    },
    "Type": 100
}

But all I want from this is "Response" and "Data". 但是,我想要的只是“响应”和“数据”。 Since it is not practical to create a 100 different model classes for each coin, I want to store information of all the coins in a common class named Coin which would look something like this : 由于为每个硬币创建100个不同的模型类是不切实际的,因此我想将所有硬币的信息存储在一个名为Coin的通用类中,该类如下所示:

public class Coins {

    @SerializedName("Algorithm")
    private String mAlgorithm;
    @SerializedName("CoinName")
    private String mCoinName;
    @SerializedName("FullName")
    private String mFullName;
    @SerializedName("FullyPremined")
    private String mFullyPremined;
    @SerializedName("Id")
    private String mId;
    @SerializedName("ImageUrl")
    private String mImageUrl;
    @SerializedName("Name")
    private String mName;
    @SerializedName("PreMinedValue")
    private String mPreMinedValue;
    @SerializedName("ProofType")
    private String mProofType;
    @SerializedName("SortOrder")
    private String mSortOrder;
    @SerializedName("Sponsored")
    private Boolean mSponsored;
    @SerializedName("Symbol")
    private String mSymbol;
    @SerializedName("TotalCoinSupply")
    private String mTotalCoinSupply;
    @SerializedName("TotalCoinsFreeFloat")
    private String mTotalCoinsFreeFloat;
    @SerializedName("Url")
    private String mUrl;

    public String getAlgorithm() {
        return mAlgorithm;
    }

    public void setAlgorithm(String Algorithm) {
        mAlgorithm = Algorithm;
    }

    public String getCoinName() {
        return mCoinName;
    }

    public void setCoinName(String CoinName) {
        mCoinName = CoinName;
    }

    public String getFullName() {
        return mFullName;
    }

    public void setFullName(String FullName) {
        mFullName = FullName;
    }

    public String getFullyPremined() {
        return mFullyPremined;
    }

    public void setFullyPremined(String FullyPremined) {
        mFullyPremined = FullyPremined;
    }

    public String getId() {
        return mId;
    }

    public void setId(String Id) {
        mId = Id;
    }

    public String getImageUrl() {
        return mImageUrl;
    }

    public void setImageUrl(String ImageUrl) {
        mImageUrl = ImageUrl;
    }

    public String getName() {
        return mName;
    }

    public void setName(String Name) {
        mName = Name;
    }

    public String getPreMinedValue() {
        return mPreMinedValue;
    }

    public void setPreMinedValue(String PreMinedValue) {
        mPreMinedValue = PreMinedValue;
    }

    public String getProofType() {
        return mProofType;
    }

    public void setProofType(String ProofType) {
        mProofType = ProofType;
    }

    public String getSortOrder() {
        return mSortOrder;
    }

    public void setSortOrder(String SortOrder) {
        mSortOrder = SortOrder;
    }

    public Boolean getSponsored() {
        return mSponsored;
    }

    public void setSponsored(Boolean Sponsored) {
        mSponsored = Sponsored;
    }

    public String getSymbol() {
        return mSymbol;
    }

    public void setSymbol(String Symbol) {
        mSymbol = Symbol;
    }

    public String getTotalCoinSupply() {
        return mTotalCoinSupply;
    }

    public void setTotalCoinSupply(String TotalCoinSupply) {
        mTotalCoinSupply = TotalCoinSupply;
    }

    public String getTotalCoinsFreeFloat() {
        return mTotalCoinsFreeFloat;
    }

    public void setTotalCoinsFreeFloat(String TotalCoinsFreeFloat) {
        mTotalCoinsFreeFloat = TotalCoinsFreeFloat;
    }

    public String getUrl() {
        return mUrl;
    }

    public void setUrl(String Url) {
        mUrl = Url;
    }

}

So finally my mapped response class would look like : 所以最终我的映射响应类如下所示:

public class CoinsListResponse {
    private boolean success;
    private List<Coins> coinsList;

    public boolean isSuccess() {
        return success;
    }

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

    public List<Coins> getCoinsList() {
        return coinsList;
    }

    public void setCoinsList(List<Coins> coinsList) {
        this.coinsList = coinsList;
    }
}

I haven't added @Serialized notations because I don't know what key to annotate it with. 我没有添加@Serialized表示法,因为我不知道用什么键进行标注。

My Retrofit service interface has a method to return the results to this map : 我的Retrofit服务界面提供了一种将结果返回到此地图的方法:

public interface CoinService {

    @NonNull
    @POST
    Observable<CoinsListResponse> getCoinList();

}

Since, I am a starter with Retrofit and RxAndroid, there might be a better method to do this, which I am not aware of. 因为,我是Retrofit和RxAndroid的初学者,所以可能有更好的方法来执行此操作,而我尚不清楚。 If so, please mention that as well !! 如果是这样,请也提一下! I am trying to get my head around this for days but couldn't find any answer on SO as well. 我试图解决这个问题几天,但是也找不到关于SO的任何答案。

Please Help !! 请帮忙 !!

Change 更改

private List<Coins> coinsList;

to

@SerializedName("Data")
private Map<String, Coins> coinsByName;

You can then either just use coinsByName.values() or call eg coinsByName.get("LTC") 然后,您可以只使用coinsByName.values()或调用例如coinsByName.get("LTC")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM