[英]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.