Не удалось показать выходные данные из объекта json - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу разобрать json из объекта json и поместить его в текстовое представление.Я попробовал какой-то метод, но не смог.Ошибка:

ожидалось BEGIN_ARRAY, но было BEGIN_OBJECT в строке 1 пути 2 столбца $

СЕРВИС API: полная версия http://139.255.86.189:83/service/api/checklistpertanyaan/1

{
  "success": true,
  "data": [
    {
      "idRchecklistpompa": "1",
      "nmChecklist": "Membersihkan Body Pompa"
    },
    {
      "idRchecklistpompa": "2",
      "nmChecklist": "Membersihkan Kabel Tray Pompa"
    },

Harian.java

public class Harian {
    @SerializedName("idRchecklistpompa")
    @Expose
    private String idRchecklistpompa;

    @SerializedName("nmChecklist")
    @Expose
    private String nmChecklist;

    public String getIdRchecklistpompa() {
        return idRchecklistpompa;
    }

    public String getNmChecklist() {
        return nmChecklist;
    }

    public void setIdRchecklistpompa(String idRchecklistpompa) {
        this.idRchecklistpompa = idRchecklistpompa;
    }

    public void setNmChecklist(String nmChecklist) {
        this.nmChecklist = nmChecklist;
    }
}

MainActivity.java

public class HarianActivity extends AppCompatActivity {

    private TextView textViewResult;
    /*private static String url = "http://139.255.86.189:83/service/api/checklistpertanyaan/1";*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_harian);

        textViewResult = findViewById(R.id.text_view_result);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://139.255.86.189:83/service/api/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        HarianApi harianApi = retrofit.create(HarianApi.class);
        Call<List<Harian>> call = harianApi.getHarian();
        call.enqueue(new Callback<List<Harian>>() {
            @Override
            public void onResponse(Call<List<Harian>> call, Response<List<Harian>> response) {
                if (!response.isSuccessful()) {
                    textViewResult.setText("CodeL " + response.code());
                    return;
                }

                List<Harian> harians = response.body();

                for (Harian harian : harians) {
                    String content = "";
                    content += "ID " + harian.getIdRchecklistpompa() + "\n";
                    content += "NAMA " + harian.getNmChecklist() + "\n";

                    textViewResult.append(content);
                }
            }

            @Override
            public void onFailure(Call<List<Harian>> call, Throwable t) {
                textViewResult.setText(t.getMessage());
            }
        });
    }
}

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

Я ожидаю, что JSON, который инкапсулирует List из Harian s, будет выглядеть так:

[
    {
      "idRchecklistpompa": "1",
      "nmChecklist": "Membersihkan Body Pompa"
    },
    {
      "idRchecklistpompa": "2",
      "nmChecklist": "Membersihkan Kabel Tray Pompa"
    }
]

Вместо этого ваш начинается с:

{
  "success": true,
  "data": [
  ...

Так что ваш API не может вернуть List<Harian>. Вместо этого ваш API должен возвращать другой класс, который выглядит примерно так:

public class Container {

    @SerializedName("success")
    private boolean success;

    @SerializedName("data")
    List<Harian> data;

    public static class Harian {
        @SerializedName("idRchecklistpompa")
        @Expose
        private String idRchecklistpompa;

        @SerializedName("nmChecklist")
        @Expose
        private String nmChecklist;

        public String getIdRchecklistpompa() {
            return idRchecklistpompa;
        }

        public String getNmChecklist() {
            return nmChecklist;
        }

        public void setIdRchecklistpompa(String idRchecklistpompa) {
            this.idRchecklistpompa = idRchecklistpompa;
        }

        public void setNmChecklist(String nmChecklist) {
            this.nmChecklist = nmChecklist;
        }
    }
}

И ваш Retrofit API возвращает Container вместо List<Harian>

0 голосов
/ 16 апреля 2019

Не уверен, что понимаю, но для отладки проблемы я бы сделал следующее:

1.- Проверьте как строку, что ответ является правильно сформированной строкой JSON.

Log.d(TAG, "My JSON String: " + response.code());

1.5.- Проверьте, является ли эта строка JSONObject или JSONArray

2.- Возможно, попытайтесь создать JSONObject / JSONArray из этой строки, чтобы увидеть, вызывает ли она исключение.

try {
   JSONObject jsonObject = new JSONObject(response.code());
} catch (JSONException e) {
   e.printStackTrace();
}

3.- Попробуйте проанализировать JSONObject, но проверьте наличие исключений:

try {
    String nmChecklist = jsonObject.getString("nmChecklist");
} catch (JSONException e) {
    e.printStackTrace();
}

4.- Если вы хотите избежать исключений, поскольку некоторые объекты могут иметь или не иметь ключ или значение:

String nmChecklist = jsonObject.has("nmChecklist") && !jsonObject.isNull("nmChecklist") ? jsonObject.getString("nmChecklist") : null;

Надеюсь, это поможет.

0 голосов
/ 16 апреля 2019

Я думаю, что есть некоторые проблемы с вашим классом. Ответ отличается от вашего класса pojo. Посмотрите json to pojo и создайте свою модель согласно сгенерированному pojo.

...