本文主要对json数据与实体类之间的拼装与解析,主要使用了fastjson、okhttp3
一、创建使用的数据类型
1.获取到上架单的数据列表,数据如下:
public class GetPageList {
@JSONField(name = "code")
private Integer code;
@JSONField(name = "msg")
private String msg;
@JSONField(name = "count")
private Integer count;
@JSONField(name = "data")
private List<DataDTO> data;
@NoArgsConstructor
@Data
public static class DataDTO {
@JSONField(name = "id")
private Integer id;
@JSONField(name = "hasbeenon")
private String hasbeenon;
@JSONField(name = "noton")
private String noton;
@JSONField(name = "billType")
private String billType;
@JSONField(name = "billNo")
private String billNo;
@JSONField(name = "billDate")
private String billDate;
@JSONField(name = "departmentNo")
private String departmentNo;
@JSONField(name = "targetDepartmentNo")
private String targetDepartmentNo;
@JSONField(name = "goodsNo")
private String goodsNo;
@JSONField(name = "goodsName")
private String goodsName;
@JSONField(name = "goodsNameFastCode")
private String goodsNameFastCode;
@JSONField(name = "batchNumber")
private String batchNumber;
@JSONField(name = "productionDate")
private String productionDate;
@JSONField(name = "validDate")
private String validDate;
@JSONField(name = "packageCount")
private Object packageCount;
@JSONField(name = "allowManualFinish")
private String allowManualFinish;
}
}
2.获取到具体单号的数据列表如下:
public class GetPackageNoList {
@JSONField(name = "code")
private Integer code;
@JSONField(name = "msg")
private String msg;
@JSONField(name = "count")
private Integer count;
@JSONField(name = "data")
private List<DataDTO> data;
@NoArgsConstructor
@Data
public static class DataDTO {
@JSONField(name = "id")
private Integer id;
@JSONField(name = "pid")
private Integer pid;
@JSONField(name = "packageNo")
private String packageNo;
@JSONField(name = "pageState")
private String pageState;
}
}
3.需要提交的数据单列表如下:
public class GetShelfList {
@JSONField(name = "id")
private String id;
@JSONField(name = "msg_type")
private String msgType;
@JSONField(name = "msg_time")
private String msgtime;
@JSONField(name = "create_user_no")
private String create_user_no;
@JSONField(name = "original_msg_id")
private String original_msg_id;
@JSONField(name = "msg_data")
private MsgDataDTO msgData;
@lombok.NoArgsConstructor
@lombok.Data
public static class MsgDataDTO {
@JSONField(name = "billtype")
private String billtype;
@JSONField(name = "billNo")
private String billNo;
@JSONField(name = "allowManualFinish")
private String allowManualFinish;
@JSONField(name = "billDate")
private String billDate;
@JSONField(name = "departmentNo")
private String departmentNo;
@JSONField(name = "targetDepartmentNo")
private String targetDepartmentNo;
@JSONField(name = "billData")
private List<BillDataDTO> billData;
@lombok.NoArgsConstructor
@lombok.Data
public static class BillDataDTO {
@JSONField(name = "goodsNo")
private String goodsNo;
@JSONField(name = "goodsBarcode")
private Object goodsBarcode;
@JSONField(name = "goodsName")
private String goodsName;
@JSONField(name = "goodsNameFastCode")
private String goodsNameFastCode;
@JSONField(name = "goodsSpec")
private String goodsSpec;
@JSONField(name = "approvalNumber")
private Object approvalNumber;
@JSONField(name = "manufacturer")
private String manufacturer;
@JSONField(name = "goodsType")
private String goodsType;
@JSONField(name = "packageSpec")
private String packageSpec;
@JSONField(name = "batchNumber")
private String batchNumber;
@JSONField(name = "productionDate")
private String productionDate;
@JSONField(name = "validDate")
private String validDate;
@JSONField(name = "packageCount")
private String packageCount;
@JSONField(name = "packageNoArray")
private List<PackageNoArrayDTO> packageNoArray;
@lombok.NoArgsConstructor
@lombok.Data
public static class PackageNoArrayDTO {
@JSONField(name = "packageNo")
private String packageNo;
}
}
}
}
二、具体的样例数据如下:
1.上架单数据如下:
{
"code": 0,
"msg": "成功",
"count": 4,
"data": [
{
"id": 24,
"hasbeenon": "2",
"noton": "0",
"billType": "SL",
"billNo": "A001",
"billDate": "2021-4-1",
"departmentNo": "1",
"targetDepartmentNo": "1",
"goodsNo": "g001",
"goodsName": "测试耗材1",
"goodsNameFastCode": "cshc1",
"batchNumber": "批号",
"productionDate": "2020-8-7",
"validDate": "2025-8-7",
"packageCount": null,
"allowManualFinish": "0"
},
{
"id": 25,
"hasbeenon": "2",
"noton": "0",
"billType": "SL",
"billNo": "A001",
"billDate": "2021-4-1",
"departmentNo": "1",
"targetDepartmentNo": "1",
"goodsNo": "g002",
"goodsName": "测试耗材2",
"goodsNameFastCode": "cshc2",
"batchNumber": "批号",
"productionDate": "2020-8-7",
"validDate": "2025-8-7",
"packageCount": null,
"allowManualFinish": "0"
},
{
"id": 26,
"hasbeenon": "1",
"noton": "1",
"billType": "SL",
"billNo": "A002",
"billDate": "2021-4-1",
"departmentNo": "1",
"targetDepartmentNo": "1",
"goodsNo": "g003",
"goodsName": "测试耗材3",
"goodsNameFastCode": "cshc3",
"batchNumber": "批号",
"productionDate": "2020-8-7",
"validDate": "2025-8-7",
"packageCount": null,
"allowManualFinish": "0"
},
{
"id": 27,
"hasbeenon": "1",
"noton": "1",
"billType": "SL",
"billNo": "A002",
"billDate": "2021-4-1",
"departmentNo": "1",
"targetDepartmentNo": "1",
"goodsNo": "g004",
"goodsName": "测试耗材4",
"goodsNameFastCode": "cshc4",
"batchNumber": "批号",
"productionDate": "2020-8-7",
"validDate": "2025-8-7",
"packageCount": null,
"allowManualFinish": "0"
}
]
}
2.表单耗材详情如下:
{
"code": 0,
"msg": "成功",
"count": 4,
"data": [
{
"id": 52,
"pid": 24,
"packageNo": "R1",
"pageState": "已上架"
},
{
"id": 53,
"pid": 24,
"packageNo": "R2",
"pageState": "已上架"
},
{
"id": 54,
"pid": 25,
"packageNo": "R3",
"pageState": "已上架"
},
{
"id": 55,
"pid": 25,
"packageNo": "R4",
"pageState": "已上架"
}
]
}
3.需要拼装出来的发送数据如下:
{
"create_user_no": "123",
"id": "7913f45d-ab7c-4ea7-a7a7-d6466cf6edc6",
"msg_time": "2021-04-20 14:42:05",
"msg_type": "ACT",
"msg_data": {
"allowManualFinish": "0",
"billDate": "2021-4-1",
"billNo": "A001",
"billType": "SL",
"departmentNo": "1",
"targetDepartmentNo": "1",
"billData": [
{
"batchNumber": "批号",
"goodsName": "测试耗材1",
"goodsNameFastCode": "cshc1",
"goodsNo": "g001",
"productionDate": "2020-8-7",
"validDate": "2025-8-7",
"packageCount": "2",
"packageNoArray": [
{
"packageNo": "R1"
},
{
"packageNo": "R2"
}
]
},
{
"batchNumber": "批号",
"goodsName": "测试耗材2",
"goodsNameFastCode": "cshc2",
"goodsNo": "g002",
"productionDate": "2020-8-7",
"validDate": "2025-8-7",
"packageCount": "2",
"packageNoArray": [
{
"packageNo": "R3"
},
{
"packageNo": "R4"
}
]
}
]
}
}
三、json数据解析到实体类
1.上架单的json数据解析到实体类
//请求获取上架单列表
private void getShelfList(){
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
Request request = new Request.Builder()
.url("http://192.168.0.64:5001/api/admin/shelves/GetPageList?page=1&limit=100")
.get()
.build();
Log.e("getShelfList", request.toString());
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("getShelfList", "" + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String strTmp = response.body().string();
JSONObject jsonObject = JSON.parseObject(strTmp);
String dataT = jsonObject.getString("data");
dataDTOList = JSON.parseArray(dataT, GetPageList.DataDTO.class);
for(int i = 0; i < dataDTOList.size(); i++){
Log.e("dataDTOList", "getId = " + dataDTOList.get(i).getId() + ", getBillType = "
+ dataDTOList.get(i).getBillType() + ", getBillDate = " + dataDTOList.get(i).getBillDate() + ", getGoodsNo = "
+ dataDTOList.get(i).getGoodsNo() + ", getGoodsName = " + dataDTOList.get(i).getGoodsName() + ", getGoodsNameFastCode = "
+ dataDTOList.get(i).getGoodsNameFastCode() + ", getProductionDate = " + dataDTOList.get(i).getProductionDate());
}
}
});
}
2.单号耗材详情的json数据解析到实体类
private void getPageListMaterial(String billNo){
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
Request request = new Request.Builder()
.url("http://192.168.0.64:5001/api/admin/shelves/GetPakegeNoListOnShelves?billNo=" + billNo)
.get()
.build();
Log.e("getPageListMaterial", request.toString());
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("getPageListMaterial", "" + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String strTmp = response.body().string();
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(strTmp);
String dataT = jsonObject.getString("data");
NoData = JSON.parseArray(dataT, GetPackageNoList.DataDTO.class);
for(int i = 0; i < NoData.size(); i++){
Log.e("getPageListMaterial", "getId = " + NoData.get(i).getId() + ", getPid = "
+ NoData.get(i).getPid() + ", getPackageNo = " + NoData.get(i).getPackageNo() + ", getPageState = "
+ NoData.get(i).getPageState());
}
}
});
}
3.将两个实体类填充到发送实体类中
int[] bill_arr;
//由外往内 拼装类数据
//一层
getShelfList = new GetShelfList();
getShelfList.setId(UUID.randomUUID().toString());
getShelfList.setMsgType("ACT");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
getShelfList.setMsgtime(simpleDateFormat.format(date));
getShelfList.setCreate_user_no("123");
getShelfList.setOriginal_msg_id(null);
//msgDataDTOList数据
//二层
if(dataDTOList != null){
bill_arr = new int[dataDTOList.size()];
int j = 0;
for(int i = 0; i < dataDTOList.size(); i++){
if(dataDTOList.get(i).getBillNo().equals(billNo)){ // 判断单号
bill_arr[j] = i; //获取单号记录
j++;
BillDataCnt++; //符合单号的耗材数量,方便后面创建耗材数组
if(BillDataCnt == 1){ //填充msgData数据
msgDataDTOList = new GetShelfList.MsgDataDTO();
msgDataDTOList.setBillDate(dataDTOList.get(i).getBillDate());
msgDataDTOList.setAllowManualFinish(dataDTOList.get(i).getAllowManualFinish());
msgDataDTOList.setBillNo(dataDTOList.get(i).getBillNo());
msgDataDTOList.setBilltype(dataDTOList.get(i).getBillType());
msgDataDTOList.setDepartmentNo(dataDTOList.get(i).getDepartmentNo());
msgDataDTOList.setTargetDepartmentNo(dataDTOList.get(i).getTargetDepartmentNo());
getShelfList.setMsgData(msgDataDTOList);
}
}
}
//填充billData数据
billDataDTOList = new ArrayList<>(BillDataCnt);
for (int i = 0; i < BillDataCnt; i++){
billDataDTO = new GetShelfList.MsgDataDTO.BillDataDTO();
billDataDTO.setGoodsNo(dataDTOList.get(bill_arr[i]).getGoodsNo());
billDataDTO.setGoodsName(dataDTOList.get(bill_arr[i]).getGoodsName());
billDataDTO.setGoodsNameFastCode(dataDTOList.get(bill_arr[i]).getGoodsNameFastCode());
billDataDTO.setBatchNumber(dataDTOList.get(bill_arr[i]).getBatchNumber());
billDataDTO.setProductionDate(dataDTOList.get(bill_arr[i]).getProductionDate());
billDataDTO.setValidDate(dataDTOList.get(bill_arr[i]).getValidDate());
//packageNoArrayDTOList数据
//三层
int a = 0;
packageNoArrayDTOList = new ArrayList<>(); //进行耗材EPC分类
for(int k = 0; k < NoData.size(); k++){ //从详情单中根据ID获取对应EPC号
if(dataDTOList.get(bill_arr[i]).getId() == NoData.get(k).getPid() ){
packageNoArrayDTO = new GetShelfList.MsgDataDTO.BillDataDTO.PackageNoArrayDTO();
packageNoArrayDTO.setPackageNo(NoData.get(k).getPackageNo());
packageNoArrayDTOList.add(a, packageNoArrayDTO);
a++;
}
}
billDataDTO.setPackageCount("" + a);
billDataDTO.setPackageNoArray(packageNoArrayDTOList);
billDataDTOList.add(i, billDataDTO);
}
getShelfList.getMsgData().setBillData(billDataDTOList); //填入msgdata中的billdata
}
四、实例类数据拼装成json数据并发送
MediaType JSON = MediaType.parse("application/json;charset=utf-8");
//由内往外 拼装json发送数据
JSONArray billDataDTO_arr = new JSONArray();
for(int i = 0; i < BillDataCnt; i++){ //填充最内层的packageNoArray
JSONObject billDataDTO_obj = new JSONObject();
billDataDTO_obj.put("goodsNo", getShelfList.getMsgData().getBillData().get(i).getGoodsNo());
billDataDTO_obj.put("goodsBarcode", getShelfList.getMsgData().getBillData().get(i).getGoodsBarcode());
billDataDTO_obj.put("goodsName", getShelfList.getMsgData().getBillData().get(i).getGoodsName());
billDataDTO_obj.put("goodsNameFastCode", getShelfList.getMsgData().getBillData().get(i).getGoodsNameFastCode());
billDataDTO_obj.put("goodsSpec", getShelfList.getMsgData().getBillData().get(i).getGoodsSpec());
billDataDTO_obj.put("approvalNumber", getShelfList.getMsgData().getBillData().get(i).getApprovalNumber());
billDataDTO_obj.put("manufacturer", getShelfList.getMsgData().getBillData().get(i).getManufacturer());
billDataDTO_obj.put("goodsType", getShelfList.getMsgData().getBillData().get(i).getGoodsType());
billDataDTO_obj.put("packageSpec", getShelfList.getMsgData().getBillData().get(i).getPackageSpec());
billDataDTO_obj.put("batchNumber", getShelfList.getMsgData().getBillData().get(i).getBatchNumber());
billDataDTO_obj.put("productionDate", getShelfList.getMsgData().getBillData().get(i).getProductionDate());
billDataDTO_obj.put("validDate", getShelfList.getMsgData().getBillData().get(i).getValidDate());
billDataDTO_obj.put("packageCount", getShelfList.getMsgData().getBillData().get(i).getPackageCount());
JSONArray packageNoArray_arr = new JSONArray();
for(int j = 0; j < Integer.valueOf(getShelfList.getMsgData().getBillData().get(i).getPackageCount()); j++){
JSONObject packageNoArray_object = new JSONObject();
packageNoArray_object.put("packageNo", getShelfList.getMsgData().getBillData().get(i).getPackageNoArray().get(j).getPackageNo());
packageNoArray_arr.add(j, packageNoArray_object);
}
billDataDTO_obj.put("packageNoArray", packageNoArray_arr);
billDataDTO_arr.add(i, billDataDTO_obj);
}
JSONObject msgData_obj = new JSONObject(); //填充二层billdata数据
msgData_obj.put("billType", getShelfList.getMsgData().getBilltype());
msgData_obj.put("billNo", getShelfList.getMsgData().getBillNo());
msgData_obj.put("allowManualFinish", getShelfList.getMsgData().getAllowManualFinish());
msgData_obj.put("billDate", getShelfList.getMsgData().getBillDate());
msgData_obj.put("departmentNo", getShelfList.getMsgData().getDepartmentNo());
msgData_obj.put("targetDepartmentNo", getShelfList.getMsgData().getTargetDepartmentNo());
msgData_obj.put("billData", billDataDTO_arr);
JSONObject msg_obj = new JSONObject(); //填充最外层msgdata数据
msg_obj.put("id", getShelfList.getId());
msg_obj.put("msg_type", getShelfList.getMsgType());
msg_obj.put("msg_time", getShelfList.getMsgtime());
msg_obj.put("create_user_no", getShelfList.getCreate_user_no());
msg_obj.put("original_msg_id", getShelfList.getOriginal_msg_id());
msg_obj.put("msg_data", msgData_obj);
Log.e("msg", "" + msg_obj.toJSONString());
注:其中代码部分比较简陋,如有疏漏欢迎指正,交流可在评论留言以及联系方式;