【问题标题】:How to catch JSON response in the TEXTVIEW?如何在 TEXTVIEW 中捕获 JSON 响应?
【发布时间】:2019-04-26 01:26:11
【问题描述】:

我是一名初学者 android 开发人员,我想捕获 JSON 数组响应,如 id、uid 等。请帮助我做到这一点。我从 YouTube 获得了很多帮助,但没有解决方案。我坚持下去。我提供了为此创建的所有文件以及 JSON。

JSON 文件

{
      "status": 0,
      "response_data": [
        {
          "id": "12",
          "uid": "USER00000003",
          "reason": "Test",
          "type": "Plan Leave",
          "SataDate": "2018-09-18",
          "EndDate": "2018-09-25",
          "ApprovedBy": "USER00000002",
          "ApprovedDate": "2018-09-18",
          "Status": "REJECTED",
          "Remarks": "Test Reject"
        },
        {
          "id": "13",
          "uid": "USER00000003",
          "reason": "Wedding",
          "type": "Plan Leave",
          "SataDate": "2018-01-28",
          "EndDate": "2018-02-05",
          "ApprovedBy": "USER00000002",
          "ApprovedDate": "2018-09-18",
          "Status": "APPROVED",
          "Remarks": "Ok"
        }
      ]
    }

API接口

public interface ApiInterface {

    @GET("leave_dtls.php")
    Call<ResponseData> getData();
}

ApiClient

public class ApiClient {
    private final static String BASE_URL = "http://api.xxxx.com/app/";
    public static ApiClient apiClient;
    private Retrofit retrofit = null;

    public static ApiClient getInstance() {
        if (apiClient == null) {
            apiClient = new ApiClient();
        }
        return apiClient;
    }

//private static Retrofit storeRetrofit = null;

    public Retrofit getClient() {
        return getClient(null);
    }



    private Retrofit getClient(final Context context) {

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.readTimeout(60, TimeUnit.SECONDS);
        client.writeTimeout(60, TimeUnit.SECONDS);
        client.connectTimeout(60, TimeUnit.SECONDS);
        client.addInterceptor(interceptor);
        client.addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                Request request = chain.request();

                return chain.proceed(request);
            }
        });

        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client.build())
                .addConverterFactory(GsonConverterFactory.create())
                .build();


        return retrofit;
    }

}

响应数据

public class ResponseData {
    @SerializedName("response_data")
    private List<ResponseDataItem> responseData;

    @SerializedName("status")
    private int status;

    public void setResponseData(List<ResponseDataItem> responseData){
        this.responseData = responseData;
    }

    public List<ResponseDataItem> getResponseData(){
        return responseData;
    }

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

    public int getStatus(){
        return status;
    }
}

响应数据项

public class ResponseDataItem {


    @SerializedName("Status")
    private String status;

    @SerializedName("uid")
    private String uid;

    @SerializedName("reason")
    private String reason;

    @SerializedName("ApprovedDate")
    private String approvedDate;

    @SerializedName("Remarks")
    private String remarks;

    @SerializedName("ApprovedBy")
    private String approvedBy;

    @SerializedName("id")
    private String id;

    @SerializedName("type")
    private String type;

    @SerializedName("EndDate")
    private String endDate;

    @SerializedName("SataDate")
    private String sataDate;

    public String getStatus() {
        return status;
    }

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

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public String getApprovedDate() {
        return approvedDate;
    }

    public void setApprovedDate(String approvedDate) {
        this.approvedDate = approvedDate;
    }

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    public String getApprovedBy() {
        return approvedBy;
    }

    public void setApprovedBy(String approvedBy) {
        this.approvedBy = approvedBy;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getEndDate() {
        return endDate;
    }

    public void setEndDate(String endDate) {
        this.endDate = endDate;
    }

    public String getSataDate() {
        return sataDate;
    }

    public void setSataDate(String sataDate) {
        this.sataDate = sataDate;
    }

}

主活动

public class MainActivity extends AppCompatActivity {

    TextView tvResponse;

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

        tvResponse=findViewById(R.id.tvResponse);

        ApiInterface apiInterface = ApiClient.getInstance().getClient().create(ApiInterface.class);
        Call<ResponseData> responseDataCall=apiInterface.getData();
        responseDataCall.enqueue(new Callback<ResponseData>() {
            @Override
            public void onResponse(Call<ResponseData> call, Response<ResponseData> response) {
                if (response.isSuccessful() && response.body()!=null && response!=null){
                    List<ResponseDataItem> data=response.body().getResponseData();

                }
            }

            @Override
            public void onFailure(Call<ResponseData> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }
}

我只想在 TEXTVIEW 中显示响应。

【问题讨论】:

    标签: java android json gson retrofit


    【解决方案1】:

    首先,您在创建ApiInterface 对象时没有传递Context。这就是为什么您的对象将无法正确创建的原因。你应该像我一样通过Context

    其次,您的ApiInterface 中有Call&lt;ResponseData&gt;,在这里您尝试在List&lt;&gt; 中获取响应。所以你应该在模型类对象中得到响应体。

    用这个更新你的代码。

    String data = "";
    ApiInterface apiInterface = ApiClient.getInstance().getClient(MainActivity.this).create(ApiInterface.class);
    Call<ResponseData> responseDataCall=apiInterface.getData();
            responseDataCall.enqueue(new Callback<ResponseData>() {
                @Override
                public void onResponse(Call<ResponseData> call, Response<ResponseData> response) {
                    if (response.isSuccessful() && response.body()!=null && response!=null){
                      ResponseData data = response.body();
                      for(int i=0; i< data.getResponseData().size(); i++){
                      String id = data.getResponseData().getId();
                      String uid = data.getResponseData().getUid();
                      //Similarly you can get others
    
                      data = data + "Id= "+ id +", uId= "+ uid + "\n";
                     }
                      //setdetails to TextView 
                      tvResponse.setText(data);
                    }
                }
    
                @Override
                public void onFailure(Call<ResponseData> call, Throwable t) {
                    t.printStackTrace();
                }
            });
    

    希望对你有帮助!

    【讨论】:

    • 感谢您的评论。但是先生,我需要在 textview 上显示响应数据项的数据
    • 更新了代码。现在看.. 它将获取所有项目的 id 和 uid
    【解决方案2】:
    ApiInterface apiInterface = 
    ApiClient.getInstance().getClient().create(ApiInterface.class);
        Call<ResponseData> responseDataCall=apiInterface.getData();
        responseDataCall.enqueue(new Callback<ResponseData>() {
            @Override
            public void onResponse(Call<ResponseData> call, Response<ResponseData> response) {
                if (response.isSuccessful() && response.body()!=null && response!=null){
                    List<ResponseDataItem> data=response.body().getResponseData();
                    tvResponse.setText(response.body().getResponseData().toString());
                }
            }
    
            @Override
            public void onFailure(Call<ResponseData> call, Throwable t) {
                t.printStackTrace();
            }
        });
    

    只需添加此行以在 textview 中显示数据, 根据您当前的问题,如果您的问题不同,请详细说明

    【讨论】:

      【解决方案3】:

      问题是你在 getClient() 方法中传递了 null 值。你没有得到你的客户。 使用以下代码:

      public static Retrofit getClient() {
          HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
          httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
          OkHttpClient.Builder builder = new OkHttpClient.Builder();
          builder.networkInterceptors().add(httpLoggingInterceptor);
          builder.interceptors().add(httpLoggingInterceptor);
          okHttpClient = builder.build();
          retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
                  .addConverterFactory(GsonConverterFactory.create())
                  .client(okHttpClient)
                  .build();
      
          return retrofit;
      }
       // then call **getClient()** like below:
      
      
      ApiInterface apiInterface = ApiClient.getInstance().getClient().create(ApiInterface.class);
          Call<ResponseData> responseDataCall=apiInterface.getData();
          responseDataCall.enqueue(new Callback<ResponseData>() {
              @Override
              public void onResponse(Call<ResponseData> call, Response<ResponseData> response) {
                  if (response.isSuccessful() && response.body()!=null && response!=null){
                      List<ResponseDataItem> data=response.body().getResponseData();
      
                  }
              }
      
              @Override
              public void onFailure(Call<ResponseData> call, Throwable t) {
                  t.printStackTrace();
              }
          });
      

      【讨论】:

        【解决方案4】:
        tvResponse.setText("show some text");
        

        在您的示例中,如果要显示多个项目,您还可以使用 append。把它放在你的方法中onResponse:

            List<ResponseDataItem> data=response.body().getResponseData();
            for (ResponseDataItem responseItem : data) {
                tvResponse.append(responseItem.getId() + "\n");
                tvResponse.append(responseItem.getUId() + "\n");
                // append any other fields you want to show
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-30
          • 2012-12-04
          • 1970-01-01
          • 2019-01-18
          • 1970-01-01
          • 2014-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多