【问题标题】:Failed to show the output from json object无法显示 json 对象的输出
【发布时间】:2019-04-16 19:20:31
【问题描述】:

我想从 json 对象中解析 json 并将其放在 textview 上。我尝试了一些方法但失败了。错误:

应为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT

API SERVICE:完整版 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());
            }
        });
    }
}

【问题讨论】:

    标签: java android json retrofit


    【解决方案1】:

    我希望封装 Harians 的 List 的 JSON 看起来像这样:

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

    相反,你的开头是:

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

    因此,您的 API 返回 List&lt;Harian&gt; 是不正确的。相反,您的 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&lt;Harian&gt;

    【讨论】:

    • 感谢您的建议,但问题是,我没有创建该 JSON,因此无法更改结构..
    • 你不需要改变 JSON 的结构 - 你需要改变你的模型类
    【解决方案2】:

    不确定我是否理解,但是为了调试问题,我会做的是:

    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;
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我认为你的课程有问题。响应与您的 pojo 课程不同。请参阅json to pojo 并根据生成的 pojo 创建您的模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多