无法从嵌套 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();
}
});
}
我想从嵌套的 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();
}
});
}