Доступ к вложенному объекту из ответа JSON в Android - PullRequest
1 голос
/ 26 октября 2019

Я учусь на модернизацию. Вот мой ответ json:

 {
  "battingStyle": "Right-hand bat",
  "born": "April 24, 1973, Bombay (now Mumbai), Maharashtra",
  "bowlingStyle": "Right-arm offbreak, Legbreak googly",
  "country": "India",
  "creditsLeft": 248,
  "currentAge": "44 years 186 days",
  "data": {
    "batting": {
      "tests": {
        "50": "68",
        "100": "51",
        "4s": "",
        "6s": "69",
        "Ave": "53.78",      
      }
    }
  },

  "playingRole": "Top-order batsman",

}

Я пытаюсь присвоить значения раздела "tests" классу Tests POJO. Но все поля инициализируются нулем. Где я ошибаюсь?

Код для моего интерфейса:

public interface ApiInterface {
    @GET("playerStats")
    Call<PlayerData> getPlayerData(@Query("apikey")String apikey, @Query("pid") String pid);

Код внутри моего MainActivity

  ApiInterface apiInterface = r.create(ApiInterface.class);
  Call<ODIs>call=apiInterface.getODIStats("apikey","pid");
  call.enqueue(new Callback<MatchData>() {
        @Override
        public void onResponse(Call<PlayerData> call, Response<PlayerData> response) {
            try {
                  JSONObject jsonObject = new JSONObject(newGson().toJson(response.body()));

                s=jsonObject.toString();
                Tests tests = new Gson().fromJson(s, Tests.class);

            }
          catch (Exception e){}

Здесь r является Retrofit экземпляром. Извините, если мой код избыточен. Я только начал изучать. Пожалуйста, дайте мне знать, если я должен предоставить дополнительную информацию.

1 Ответ

0 голосов
/ 26 октября 2019

Вы должны пройти каждый уровень, в данном случае сначала data объект, затем batting объект и, наконец, tests объект.

JSONObject jsonObject = new JSONObject(newGson().toJson(response.body()));
JSONObject testsObj = jsonObject.getJSONObject("data").getJSONObject("batting").getJSONObject("tests");

Tests tests = new Gson().fromJson(testsObj.toString(), Tests.class);

Обратите внимание, что для его работы у вас естьиспользовать аннотацию SerializedName, чтобы пометить имя каждого поля в JSON, поскольку имена переменных не могут начинаться с цифры:

import com.google.gson.annotations.SerializedName;

public class Tests{
    @SerializedName("50")
    private String fifteen;

    @SerializedName("100")
    private String hundred;

    @SerializedName("4s")
    private String fourS;

    @SerializedName("6s")
    private String sixS;

    private String Ave;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...