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

时间:2018-01-20 19:17:37

标签: java android json parsing retrofit

我开始使用RxJava和Retrofit,并希望创建一个简单的应用程序来显示100个加密货币的列表。

我正在进行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
}

但我想要的只是"响应"和"数据"。由于为每个硬币创建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;
    }

}

所以最后我的映射响应类看起来像:

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

我还没有添加@Serialized符号,因为我不知道用它注释的关键字。

我的Retrofit服务界面有一个方法可以将结果返回到此地图:

public interface CoinService {

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

}

因为我是Retrofit和RxAndroid的首发,可能有更好的方法来做到这一点,我不知道。如果是这样,请同时提及!!我试图了解这几天,但也无法找到任何答案。

请帮助!!

1 个答案:

答案 0 :(得分:0)

更改

private List<Coins> coinsList;

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

然后,您可以使用coinsByName.values()或致电例如coinsByName.get("LTC")