JSON Parse (Retrofit2)
При запросе приходят вот такие данные:
{"status":"ok",
"data":{
"1":{
"statistics":{
"all":{"wins":1941}
},
"nickname":"nickname1",
"account_id":1
}
"2":{
"statistics":{
"all":{"wins":133}
},
"nickname":"nickname2",
"account_id":2
}
...
}}
Здесь 1, 2 - account_id. На сервер повлиять не могу. Не получается правильно прописать в классе то, что находится в data. То есть я даже не могу вытащить account_id и nickname. http://www.jsonschema2pojo.org/ предлагает создать классы _1, _2 и т.д., но это неверно (наверное).
public class PlayerInfoResponse {
@SerializedName("status")
@Expose
private String status;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
Или может я неправильно делаю запрос?
public interface Api {
@FormUrlEncoded
@POST("account/list/")
Observable<AccountResponse> getAccounts(@Field("application_id") String appId, @Field("search") String nickname);
@FormUrlEncoded
@POST("account/info/")
Observable<PlayerInfoResponse> getPlayerInfo(@Field("application_id") String appId, @Field("account_id") Integer accountId);
}
public Observable<AccountResponse> getAccounts(String nickname) {
return App.getApi().getAccounts(appId, nickname);
}
public Observable<PlayerInfoResponse> getPlayerInfo(Integer accountId) {
return App.getApi().getPlayerInfo(appId, accountId);
}
Observable<AccountResponse> observable = remoteRepository.getAccounts(nickname);
observable
.flatMap(accountResponse -> {
Log.d(TAG, "first: " + accountResponse.getAccountData().get(0).getNickname());
return remoteRepository.getPlayerInfo(accountResponse.getAccountData().get(0).getAccountId());
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.distinctUntilChanged()
.subscribe(new Observer<PlayerInfoResponse>() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onNext(PlayerInfoResponse playerInfoResponse) {
Log.d(TAG, "second: " + playerInfoResponse.getStatus());
searchCallback.onNext(playerInfoResponse);
}
@Override
public void onError(Throwable e) { }
@Override
public void onComplete() {
searchCallback.onComplete();
}
});
PS: прошу не обращать внимание на ...getAccountData().get(0)... пытался тестировать только с первым найденным аккаунтом, в последующем будет отправляться список.
Ответы (1 шт):
Автор решения: Circassian
→ Ссылка
Вам нужны примерно такие модели. Аннотации и методы доступа к полям допишите сами.
class PlayerInfoResponse {
String status;
HashMap<String, Data> data;
}
class Data {
int account_id;
String nickname;
Statistics statistics;
}
class Statistics {
All all;
}
class All {
int wins;
}