【问题标题】:How to display JSON data from API server in TextView and EditText in Android?如何在 Android 的 TextView 和 EditText 中显示来自 API 服务器的 JSON 数据?
【发布时间】:2019-11-28 06:00:29
【问题描述】:

我正在尝试获取 JSON 响应的值并将其显示在我的 textView 和 editText 中。但是我得到一个 null object reference 作为错误。

JSON 响应:

{
    "srNo": 1,
    "date": "11/14/2019 12:00:00 AM",
    "fieldEngineer": "Angel",
    "accountName": "Forever 21 Megamall",
    "irNo": 1,
    "joNo": 1,
    "address": "Mandaluyong City",
    "contactPerson": "Jansen Babon",
    "designation": "",
    "contactNo": "",
    "email": "",
    "timeIn": "00:00:00",
    "timeOut": "00:00:00",
    "productType": "Security",
    "problem": ""
}

Java 类:

    private void fetchData() {
        JsonObject paramObject = new JsonObject();


        Call<ResObj> call = userService.userLogin(paramObject);
        call.enqueue(new Callback<ResObj>() {
            @Override
            public void onResponse(Call<ResObj> call, retrofit2.Response<ResObj> response) {



               ResObj resObj = response.body();

               String srNo = resObj.getSrNo();
               String date = resObj.getDate();
               String fieldEngineer = resObj.getFieldEngineer();
               String accountName = resObj.getAccountName();
               String irNo = resObj.getIrNo();
               String joNo = resObj.getJoNo();
               String address = resObj.getAddress();
               String contactPerson = resObj.getContactPerson();
               String designation = resObj.getDesignation();
               String contactNo = resObj.getContactNo();
               String email = resObj.getEmail();
               String timeIn = resObj.getTimeIn();
               String timeOut = resObj.getTimeOut();
               String productType = resObj.getProductType();
               String problem = resObj.getProblem();

               //the response I am getting here is null

               tvSrNo.setText(srNo);
               etdate.setText(date);
               etfieldengineer.setText(fieldEngineer);
               etaccname.setText(accountName);
               etirno.setText(irNo);
               etjono.setText(joNo);

                JsonObject workObj = new JsonObject();

                try {
                    workObj.addProperty("srNo", resObj.getSrNo());
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void onFailure(Call<ResObj> call, Throwable t) {

            }
        });
    }

我尝试使用此tvSrNo.setText(resObj.getSrNo()) 而不是tvSrNo.setText(srNo),但仍然遇到同样的问题。

我也在使用 Retrofit。

我希望 JSON 数据将被放置在 editText 或 textView 中的结果。但显然,响应正在变为空。

ResObj 类:

    private String date;
    private String address;
    private String accountName;
    private String contactPerson;
    private String timeOut;
    private String problem;
    private String srNo;
    private String fieldEngineer;
    private String joNo;
    private String irNo;
    private String message;
    private String designation;
    private String email;
    private String timeIn;
    private String productType;
    private boolean status;
    private String contactNo;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }


    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getAccountName() {
        return accountName;
    }

    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }

    public String getContactPerson() {
        return contactPerson;
    }

    public void setContactPerson(String contactPerson) {
        this.contactPerson = contactPerson;
    }

    public String getTimeOut() {
        return timeOut;
    }

    public void setTimeOut(String timeOut) {
        this.timeOut = timeOut;
    }

    public String getProblem() {
        return problem;
    }

    public void setProblem(String problem) {
        this.problem = problem;
    }

    public String getSrNo() {
        return srNo;
    }

    public void setSrNo(String srNo) {
        this.srNo = srNo;
    }

    public String getFieldEngineer() {
        return fieldEngineer;
    }

    public void setFieldEngineer(String fieldEngineer) {
        this.fieldEngineer = fieldEngineer;
    }

    public String getJoNo() {
        return joNo;
    }

    public void setJoNo(String joNo) {
        this.joNo = joNo;
    }

    public String getIrNo() {
        return irNo;
    }

    public void setIrNo(String irNo) {
        this.irNo = irNo;
    }

    public String getDesignation() {
        return designation;
    }

    public void setDesignation(String designation) {
        this.designation = designation;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTimeIn() {
        return timeIn;
    }

    public void setTimeIn(String timeIn) {
        this.timeIn = timeIn;
    }

    public String getProductType() {
        return productType;
    }

    public void setProductType(String productType) {
        this.productType = productType;
    }

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    public String getContactNo() {
        return contactNo;
    }

    public void setContactNo(String contactNo) {
        this.contactNo = contactNo;
    }

Logcat:

    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.android.ras.ResObj.getSrNo()' on a null object reference
        at com.example.android.ras.MainActivity$3.onResponse(MainActivity.java:187)
        at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:71)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

【问题讨论】:

  • 你能告诉我们你的 POJO / getter 和 setter 文件吗?
  • 可能视图为空,添加崩溃日志以获取更多信息
  • 在回复中输入日志并检查您是否得到完美回复。
  • 试着让你的ResObj 成为一个数据类。删除所有 setter 和 getter 并将字段公开。但我的直觉是返回的正文为空。你调试了吗?你能登录response.body()吗?
  • 问题就在这里。 ResObj resObj = response.body(); response.body() 给出空值。首先检查您的 API 是否有效并在邮递员中给出正确的响应。

标签: java android rest retrofit2


【解决方案1】:

将字符串更改为整数

 public class Codebeautify {
     private Integer srNo;
     private String date;
     private String fieldEngineer;
     private String accountName;
     private Integer irNo;
     private Integer joNo;
     private String address;
     private String contactPerson;
     private String designation;
     private String contactNo;
     private String email;
     private String timeIn;
     private String timeOut;
     private String productType;
     private String problem;


     // Getter Methods 

     public Integer getSrNo() {
      return srNo;
     }

     public String getDate() {
      return date;
     }

     public String getFieldEngineer() {
      return fieldEngineer;
     }

     public String getAccountName() {
      return accountName;
     }

     public Integer getIrNo() {
      return irNo;
     }

     public  Integer getJoNo() {
      return joNo;
     }

     public String getAddress() {
      return address;
     }

     public String getContactPerson() {
      return contactPerson;
     }

     public String getDesignation() {
      return designation;
     }

     public String getContactNo() {
      return contactNo;
     }

     public String getEmail() {
      return email;
     }

     public String getTimeIn() {
      return timeIn;
     }

     public String getTimeOut() {
      return timeOut;
     }

     public String getProductType() {
      return productType;
     }

     public String getProblem() {
      return problem;
     }

     // Setter Methods 

     public void setSrNo(Integer srNo) {
      this.srNo = srNo;
     }

     public void setDate(String date) {
      this.date = date;
     }

     public void setFieldEngineer(String fieldEngineer) {
      this.fieldEngineer = fieldEngineer;
     }

     public void setAccountName(String accountName) {
      this.accountName = accountName;
     }

     public void setIrNo(Integer irNo) {
      this.irNo = irNo;
     }

     public void setJoNo(Integer joNo) {
      this.joNo = joNo;
     }

     public void setAddress(String address) {
      this.address = address;
     }

     public void setContactPerson(String contactPerson) {
      this.contactPerson = contactPerson;
     }

     public void setDesignation(String designation) {
      this.designation = designation;
     }

     public void setContactNo(String contactNo) {
      this.contactNo = contactNo;
     }

     public void setEmail(String email) {
      this.email = email;
     }

     public void setTimeIn(String timeIn) {
      this.timeIn = timeIn;
     }

     public void setTimeOut(String timeOut) {
      this.timeOut = timeOut;
     }

     public void setProductType(String productType) {
      this.productType = productType;
     }

     public void setProblem(String problem) {
      this.problem = problem;
     }
    }

【讨论】:

    【解决方案2】:

    让你的 POJO 类像这样

    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class Example {
    
    @SerializedName("srNo")
    @Expose
    private Integer srNo;
    @SerializedName("date")
    @Expose
    private String date;
    @SerializedName("fieldEngineer")
    @Expose
    private String fieldEngineer;
    @SerializedName("accountName")
    @Expose
    private String accountName;
    @SerializedName("irNo")
    @Expose
    private Integer irNo;
    @SerializedName("joNo")
    @Expose
    private Integer joNo;
    @SerializedName("address")
    @Expose
    private String address;
    @SerializedName("contactPerson")
    @Expose
    private String contactPerson;
    @SerializedName("designation")
    @Expose
    private String designation;
    @SerializedName("contactNo")
    @Expose
    private String contactNo;
    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("timeIn")
    @Expose
    private String timeIn;
    @SerializedName("timeOut")
    @Expose
    private String timeOut;
    @SerializedName("productType")
    @Expose
    private String productType;
    @SerializedName("problem")
    @Expose
    private String problem;
    
    public Integer getSrNo() {
    return srNo;
    }
    
    public void setSrNo(Integer srNo) {
    this.srNo = srNo;
    }
    
    public String getDate() {
    return date;
    }
    
    public void setDate(String date) {
    this.date = date;
    }
    
    public String getFieldEngineer() {
    return fieldEngineer;
    }
    
    public void setFieldEngineer(String fieldEngineer) {
    this.fieldEngineer = fieldEngineer;
    }
    
    public String getAccountName() {
    return accountName;
    }
    
    public void setAccountName(String accountName) {
    this.accountName = accountName;
    }
    
    public Integer getIrNo() {
    return irNo;
    }
    
    public void setIrNo(Integer irNo) {
    this.irNo = irNo;
    }
    
    public Integer getJoNo() {
    return joNo;
    }
    
    public void setJoNo(Integer joNo) {
    this.joNo = joNo;
    }
    
    public String getAddress() {
    return address;
    }
    
    public void setAddress(String address) {
    this.address = address;
    }
    
    public String getContactPerson() {
    return contactPerson;
    }
    
    public void setContactPerson(String contactPerson) {
    this.contactPerson = contactPerson;
    }
    
    public String getDesignation() {
    return designation;
    }
    
    public void setDesignation(String designation) {
    this.designation = designation;
    }
    
    public String getContactNo() {
    return contactNo;
    }
    
    public void setContactNo(String contactNo) {
    this.contactNo = contactNo;
    }
    
    public String getEmail() {
    return email;
    }
    
    public void setEmail(String email) {
    this.email = email;
    }
    
    public String getTimeIn() {
    return timeIn;
    }
    
    public void setTimeIn(String timeIn) {
    this.timeIn = timeIn;
    }
    
    public String getTimeOut() {
    return timeOut;
    }
    
    public void setTimeOut(String timeOut) {
    this.timeOut = timeOut;
    }
    
    public String getProductType() {
    return productType;
    }
    
    public void setProductType(String productType) {
    this.productType = productType;
    }
    
    public String getProblem() {
    return problem;
    }
    
    public void setProblem(String problem) {
    this.problem = problem;
    }
    
    }
    

    确保在您的改造实例中有 Gson 转换器

    private static Retrofit getRetrofitInstance() {
            return new Retrofit.Builder()
                    .baseUrl(ROOT_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
    

    然后调用并将数据放入ArrayList中

    【讨论】:

    • @NaitikSoni 它仍然没有工作。它仍然得到同样的错误。
    【解决方案3】:

    java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String com.example.android.ras.ResObj.getSrNo()”

    注意:NullPointerException 因为你没有在模型类中声明 SrNo

    尝试使用 jason to java 类生成器:

    http://www.jsonschema2pojo.org/

    来源类型:JSON 注释样式:Gson(如果您使用 GSON)或无 包括 getter 和 setter

    public class Example {
    
    private Integer srNo;
    private String date;
    private String fieldEngineer;
    private String accountName;
    private Integer irNo;
    private Integer joNo;
    private String address;
    private String contactPerson;
    private String designation;
    private String contactNo;
    private String email;
    private String timeIn;
    private String timeOut;
    private String productType;
    private String problem;
    
    public Integer getSrNo() {
    return srNo;
    }
    
    public void setSrNo(Integer srNo) {
    this.srNo = srNo;
    }
    
    public String getDate() {
    return date;
    }
    
    public void setDate(String date) {
    this.date = date;
    }
    
    public String getFieldEngineer() {
    return fieldEngineer;
    }
    
    public void setFieldEngineer(String fieldEngineer) {
    this.fieldEngineer = fieldEngineer;
    }
    
    public String getAccountName() {
    return accountName;
    }
    
    public void setAccountName(String accountName) {
    this.accountName = accountName;
    }
    
    public Integer getIrNo() {
    return irNo;
    }
    
    public void setIrNo(Integer irNo) {
    this.irNo = irNo;
    }
    
    public Integer getJoNo() {
    return joNo;
    }
    
    public void setJoNo(Integer joNo) {
    this.joNo = joNo;
    }
    
    public String getAddress() {
    return address;
    }
    
    public void setAddress(String address) {
    this.address = address;
    }
    
    public String getContactPerson() {
    return contactPerson;
    }
    
    public void setContactPerson(String contactPerson) {
    this.contactPerson = contactPerson;
    }
    
    public String getDesignation() {
    return designation;
    }
    
    public void setDesignation(String designation) {
    this.designation = designation;
    }
    
    public String getContactNo() {
    return contactNo;
    }
    
    public void setContactNo(String contactNo) {
    this.contactNo = contactNo;
    }
    
    public String getEmail() {
    return email;
    }
    
    public void setEmail(String email) {
    this.email = email;
    }
    
    public String getTimeIn() {
    return timeIn;
    }
    
    public void setTimeIn(String timeIn) {
    this.timeIn = timeIn;
    }
    
    public String getTimeOut() {
    return timeOut;
    }
    
    public void setTimeOut(String timeOut) {
    this.timeOut = timeOut;
    }
    
    public String getProductType() {
    return productType;
    }
    
    public void setProductType(String productType) {
    this.productType = productType;
    }
    
    public String getProblem() {
    return problem;
    }
    
    public void setProblem(String problem) {
    this.problem = problem;
    }
    
    }
    

    【讨论】:

      【解决方案4】:

      first : 检查响应输出, 你可以 Log.i 或 Toast it,,, 如果您的响应未加载或为空...-(此处的问题)

      第二:如果响应正常,请检查您的 ResObj.getSrNo()。 再次打印...检查 字符串 srNo = resObj.getSrNo(); Log.i srNo...(有问题与否)

      或者检查你的类代码美化

      【讨论】:

        【解决方案5】:
        JsonObject paramObject = new JsonObject();
        
        Call<ResObj> call = userService.userLogin(paramObject); // paramObject is empty object
        

        您将空的 JsonObject 传递给您的 API 参数。

        因此您必须将参数值添加到您的paramObject。像这样

        try {
             JsonObject paramObject = new JsonObject();
             paramObject.addProperty("mobile", mobile);
             // add other properties if you have
        
        } catch (JSONException e) {
             e.printStackTrace();
        }
        

        之后你应该调用你的 api

        Call<ResObj> call = userService.userLogin(paramObject);
        

        【讨论】:

          【解决方案6】:

          我看到问题出在解析中,改造无法映射,因为您的响应没有 ResObj 作为 root。

          { "ResObj": { "srNo": 1, "date": "11/14/201912: 00: 00AM", "fieldEngineer": "Angel", "accountName": "Forever21Megamall", "irNo": 1, "joNo": 1, "address": "MandaluyongCity", "contactPerson": "JansenBabon", "designation": "", "contactNo": "", "email": "", "timeIn": "00: 00: 00", "timeOut": "00: 00: 00", "productType": "Security", "problem": "" } }
          

          修改您的回复或更改您的请求

          Call<JSONObject> call = userService.userLogin(paramObject);
          

          稍后手动提取值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-11
            • 2015-11-24
            • 2018-09-05
            • 1970-01-01
            • 1970-01-01
            • 2022-01-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多