无法从嵌套 json 改造 android 工作室获取价值

Cannot get value from nested json retrofit android studio

我想从嵌套的 json 中获取值并使用改造。 LicenseCDL 和 LicenseVDL classes 的值为空。如何从两个数组中获取数据? java class 我哪里漏了?

这是Json的样子。

{
    "data": {
        "LicenseCDL": [
            {
                "class_code": "B2",
                "invoice_num": "W1007INV20051",
                "total": "1484.00",
                "created_at": "2020-05-18 08:56:13"
            }
        ],
        "LicenseVDL": [
            {
                "class_code": "PSV VAN",
                "invoice_num": "W1007INV20052",
                "total": "583.00",
                "created_at": "2020-05-18 10:12:13"
            }
        ]
    },
    "status": "1",
    "message": "record found."
}

这是 LicenseClassModel

public class LicenseClassModel {

@SerializedName("LicenseCDL")
private List<LicenseCDL> LicenseCDL;
@SerializedName("LicenseVDL")
private List<LicenseVDL> LicenseVDL;

@SerializedName("message")
private String message;
@SerializedName("status")
private String status;

public List<LicenseClassModel.LicenseCDL> getLicenseCDL() {
    return LicenseCDL;
}

public List<LicenseClassModel.LicenseVDL> getLicenseVDL() {
    return LicenseVDL;
}

public String getMessage() {
    return message;
}

public String getStatus() {
    return status;
}

public static class LicenseCDL {

    @SerializedName("class_code")
    private String classCode;
    @SerializedName("data")
    private List<LicenseDataItem> data;

    public String getClassCode() {
        return classCode;
    }

    public List<LicenseDataItem> getData() {
        return data;
    }
}

public static class LicenseVDL {

    @SerializedName("class_code")
    private String classCode;
    @SerializedName("data")
    private List<LicenseDataItem> data;

    public String getClassCode() {
        return classCode;
    }

    public List<LicenseDataItem> getData() {
        return data;
    }
}

这是我想要获取值的方法

 private void callLicenseApi() {
        Call<LicenseClassModel> CheckCall = apiInterface.LICENSE_CLASS_LIST_CALL(String.valueOf(UserData.getId()));
        CheckCall.enqueue(new Callback<LicenseClassModel>() {
            @Override
            public void onResponse(@NonNull Call<LicenseClassModel> call, @NonNull Response<LicenseClassModel> response) {
                Log.i("???","value cdl: "  + response.body().getLicenseCDL()); //output: value cdl: null 
                Log.i("???","value vdl: "  + response.body().getLicenseVDL()); //output: value cdl: null 
            }

        @Override
        public void onFailure(Call<LicenseClassModel> call, Throwable t) {
            Log.i("???","Erorr : "  + t.getMessage());
        }
    });
}

LicenseCDL 和 LicenseVDL 都在 "data" 密钥中 所以您需要更新 类

public class LicenseClassModel {

@SerializedName("data")
@Expose
private Data data;
@SerializedName("status")
@Expose
private String status;
@SerializedName("message")
@Expose
private String message;

public Data getData() {
return data;
}

public void setData(Data data) {
this.data = data;
}

public String getStatus() {
return status;
}

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

public String getMessage() {
return message;
}

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

}

public class Data {

@SerializedName("LicenseCDL")
@Expose
private List<LicenseCDL> licenseCDL = null;
@SerializedName("LicenseVDL")
@Expose
private List<LicenseVDL> licenseVDL = null;

public List<LicenseCDL> getLicenseCDL() {
return licenseCDL;
}

public void setLicenseCDL(List<LicenseCDL> licenseCDL) {
this.licenseCDL = licenseCDL;
}

public List<LicenseVDL> getLicenseVDL() {
return licenseVDL;
}

public void setLicenseVDL(List<LicenseVDL> licenseVDL) {
this.licenseVDL = licenseVDL;
}

}

我通过将模型 class 更改为这个解决了这个问题。

public class LicenseClassModel {

@SerializedName("data")
private LicensePerantaraan data;

@SerializedName("message")
private String message;

@SerializedName("status")
private String status;

public LicensePerantaraan getData() {
    return data;
}

public String getMessage() {
    return message;
}

public String getStatus() {
    return status;
}

public static class LicensePerantaraan {
    @SerializedName("LicenseCDL")
    private List<LicenseDataItem> LicenseCDL;

    @SerializedName("LicenseVDL")
    private List<LicenseDataItem> LicenseVDL;

    public List<LicenseClassModel.LicenseDataItem> getLicenseCDL() {
        return LicenseCDL;
    }

    public List<LicenseClassModel.LicenseDataItem> getLicenseVDL() {
        return LicenseVDL;
    }
}

public static class LicenseDataItem {

    @SerializedName("class_code")
    private String classCode;
    @SerializedName("invoice_num")
    private String invoiceNum;
    @SerializedName("total")
    private double total;
    @SerializedName("created_at")
    private String createdAt;

    public String getClassCode() {
        return classCode;
    }

    public String getInvoiceNum() {
        return invoiceNum;
    }

    public double getTotal() {
        return total;
    }

    public String getCreatedAt() {
        return createdAt;
    }
}
}

然后我在适配器中调用了这个方法。使用数组和使用方法 addAll,在使用该方法之前,先清除数组 1st.

private void callLicenseApi() {
        licenseDataItemArrayList.clear();
        Call<LicenseClassModel> CheckCall = apiInterface.LICENSE_CLASS_LIST_CALL(String.valueOf(UserData.getId()));
        CheckCall.enqueue(new Callback<LicenseClassModel>() {
            @Override
            public void onResponse(@NonNull Call<LicenseClassModel> call, @NonNull Response<LicenseClassModel> response) {
                if (response.code() == 200) {
                    if (response.body() != null)
                        if (response.body().getStatus().equals("1")) {
                            if (response.body().getData().getLicenseCDL().size() != 0) {
                                licenseDataItemArrayList.addAll(response.body().getData().getLicenseCDL());
                                licenseDataItemArrayList.addAll(response.body().getData().getLicenseVDL());

                            licenseClassAdapter = new LicenseClassAdapter(con, licenseDataItemArrayList, new RecyclerViewBaseAdapter.ItemSelectedListener<LicenseClassModel.LicenseDataItem>() {
                                @Override
                                public void onItemSelected(LicenseClassModel.LicenseDataItem listItem) {

                                }
                            });
                            tvNoRecordFound.setVisibility(View.GONE);
                            rv.setVisibility(View.VISIBLE);
                            rv.setLayoutManager(new LinearLayoutManager(con));
                            rv.setAdapter(licenseClassAdapter);
                        } else {
                            rv.setVisibility(View.GONE);
                            tvNoRecordFound.setVisibility(View.VISIBLE);
                        }

                    } else {
                        Toast.makeText(con, getString(R.string.record_not_found), Toast.LENGTH_SHORT).show();
                        tvNoRecordFound.setVisibility(View.VISIBLE);
                    }
            } else {
                Toast.makeText(con, getString(R.string.record_not_found), Toast.LENGTH_SHORT).show();
                tvNoRecordFound.setVisibility(View.VISIBLE);
            }
            lytProgress.setVisibility(View.GONE);
        }

        @Override
        public void onFailure(Call<LicenseClassModel> call, Throwable t) {
            callAPiForLog(TAG, t.getMessage());
            Toast.makeText(con, t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}