Ferial Fahlevi
Ferial Fahlevi

Reputation: 1

Failed to show the output from json object

I want to parse json from json object and put it on textview. I tried some method but failed. The error:

expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

API SERVICE: Full ver 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());
            }
        });
    }
}

Upvotes: 0

Views: 57

Answers (3)

Abhijit Howal
Abhijit Howal

Reputation: 13

I think there is some problem with your class. The response is different from your pojo class. See json to pojo and create your Model as per the generated pojo.

Upvotes: 0

icortesi
icortesi

Reputation: 760

Not sure if I understand but, to debug the problem what I would do is:

1.- Check as a String that response is a well formed JSON String.

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

1.5.- Check if that string is a JSONObject or a JSONArray

2.- Probably try to create a JSONObject/JSONArray from that String to see if it triggers an exception.

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

3.- Try to parse the JSONObject but checking for exceptions:

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

4.- If you want to avoid exceptions since some objects may or may not have a key or value:

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

I hope this helps.

Upvotes: 0

PPartisan
PPartisan

Reputation: 8231

I would expect JSON that encapsulated a List of Harians to look like this:

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

Instead, yours begins with:

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

So it isn't correct for your API to return List<Harian>. Instead, your API should return a different class which looks more like:

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

And have your Retrofit API return Container rather than List<Harian>

Upvotes: 1

Related Questions