JSON<--->String
字符串和JSON之間的相互轉換主要是JSON參數的拼裝和解析.
一、目標字符串:{"LT_TABLE":[{"T_ACT_DOC_HEAD_I":[{"SOURCE":"EAS(HRP)","BUKRS":"1000","GJAHR":"2016","OBELNR":"100000000","USNAM":"","BUDAT":"","BELNR_R":"","WAERS":"","KURSF":"","BELNR":""},{"SOURCE":"EAS(HRP)","BUKRS":"2000","GJAHR":"2016","OBELNR":"100000002","USNAM":"","BUDAT":"","BELNR_R":"","WAERS":"","KURSF":"","BELNR":""}],"T_ACT_DOC_ITEM_I":[{"SOURCE":"EAS(HRP)","BUKRS":"1000","GJAHR":"2016","OBELNR":"100000000","BUZEI":"1 ","OSHKZG":"","LIFNR":"","HKONT":"","WRBTR":"","KOSTL":"","SGTXT":"","FBKNUM":"","FBKACT":""},{"SOURCE":"EAS(HRP)","BUKRS":"1000","GJAHR":"2016","OBELNR":"100000000","BUZEI":"2 ","OSHKZG":"","LIFNR":"","HKONT":"","WRBTR":"","KOSTL":"","SGTXT":"","FBKNUM":"","FBKACT":""},{"SOURCE":"EAS(HRP)","BUKRS":"2000","GJAHR":"2016","OBELNR":"100000002","BUZEI":"1 ","OSHKZG":"","LIFNR":"","HKONT":"","WRBTR":"","KOSTL":"","SGTXT":"","FBKNUM":"","FBKACT":""},{"SOURCE":"EAS(HRP)","BUKRS":"2000","GJAHR":"2016","OBELNR":"100000002","BUZEI":"2 ","OSHKZG":"","LIFNR":"","HKONT":"","WRBTR":"","KOSTL":"","SGTXT":"","FBKNUM":"","FBKACT":""},{"SOURCE":"EAS(HRP)","BUKRS":"2000","GJAHR":"2016","OBELNR":"100000002","BUZEI":"3 ","OSHKZG":"","LIFNR":"","HKONT":"","WRBTR":"","KOSTL":"","SGTXT":"","FBKNUM":"","FBKACT":""}]}]}
格式化之后分析(如果需求中的json結構自己看不明白,可將需求粘貼至http://www.json.cn/中格式化即可)
圖0的結構是一個vo,亦可放到array中;
圖1的結構是一個array/vo中存一個key為"LT_TABLE",value為一個array的map;
圖2的結構是array中存的是一個VO(object value,此處解析工具解析出來沒有vo類的類名)
圖3的結構是這個vo的兩個屬性,key分別為"T_ACT_DOC_HEAD_I"和"T_ACT_DOC_ITEM_I"的兩個map,map的value分別是兩個array
圖4的結構是key為"T_ACT_DOC_HEAD_I"的map中存的一個長度為2的array和key為"T_ACT_DOC_ITEM_I"的map中存的一個長度為5的array.
圖5的結構是長度為5的array和長度為2的array中存的不同的vo.
圖0.
圖1.
圖2.
圖3.
圖4.
圖5.
圖6.
json轉換string
JsonConfig jsonCfg = new JsonConfig();
String jsonStr=null;
//判斷是否是list (LT_TABLE instanceof Collection || LT_TABLE instanceof Object[])
if (mapTable instanceof Collection) {
jsonStr = JSONArray.fromObject(mapTable, jsonCfg).toString();
} else {
jsonStr = JSONObject.fromObject(mapTable, jsonCfg).toString();
}
二、json解析
待解析字符串:{"LT_TABLE":[{"T_ACT_DOC_HEAD_O":[{"SOURCE":"EAS(HRP)","BUKRS":"1000","GJAHR":"2016","OBELNR":"100000000","BELNR":"0100000002","TYPE":"S","LOG":"成功!"},{"SOURCE":"EAS(HRP)","BUKRS":"2000","GJAHR":"2016","OBELNR":"100000002","BELNR":"0100000005","TYPE":"E","LOG":"失敗!"}]}]}
結構分析:
圖0.對方系統返回的字符串,本人用array存,也可以用vo存,跟上邊一樣,但是轉json的方式就不是用上邊這種方式轉換了。
圖1.array中存的一個key為"LT_TABLE",value為一個array的map。
圖2.array中存一個vo。
圖3.這個vo只有一個為map的屬性,這個屬性名為“T_ACT_DOC_HEAD_O”,key也是“T_ACT_DOC_HEAD_O”,value是一個array。
圖4.這個array中存兩個vo。
圖5.其中一個vo的屬性。
圖0.
圖1.
圖2.
圖3.
圖4.
圖5
附:代碼(json to string)
ArrayList<JsonDetailVO> jsonDetailVOlList= new ArrayList<JsonDetailVO>();
ArrayList<JsonVoucherVO> jsonVoucherVOList= new ArrayList<JsonVoucherVO>();
for(int i=0;i< vouchervos.size();i++){
VoucherVO voucherVO = vouchervos.get(i);
String HRStr=voucherVO.getYear()+voucherVO.getPeriod()+voucherVO.getPrepareddate().toString().substring(8,10)+":"+voucherVO.getNo();
JsonVoucherVO jsonVoucherVO=new JsonVoucherVO();
jsonVoucherVO.setSOURCE("HRP");//數據源
jsonVoucherVO.setBUKRS(voucherVO.getPk_group().toString());//公司代碼
jsonVoucherVO.setGJAHR(voucherVO.getYear().toString());//會計年度
jsonVoucherVO.setOBELNR(HRStr);//HR憑證號
jsonVoucherVO.setUSNAM(voucherVO.getCreator().toString());//輸入者
jsonVoucherVO.setBUDAT("憑證中的過賬日期");//憑證中的過賬日期:voucherVO.getTallydate().toString()
jsonVoucherVO.setBELNR_R("待沖銷SAP憑證號 ");//待沖銷SAP憑證號 :voucherVO.getOffervoucher().toString()
jsonVoucherVO.setWAERS("貨幣碼");//貨幣碼
jsonVoucherVO.setKURSF("匯率");//匯率
jsonVoucherVO.setBELNR("會計文件號碼");//會計文件號碼
jsonVoucherVOList.add(jsonVoucherVO);
DetailVO[] detailVOlist1=voucherVO.getDetails();
for(int j=0;j<detailVOlist1.length;j++){
DetailVO detailVO = detailVOlist1[i];
JsonDetailVO jsonDetailVO=new JsonDetailVO();
jsonDetailVO.setSOURCE("HRP");//數據源
jsonDetailVO.setBUKRS("公司代碼");//公司代碼
jsonDetailVO.setGJAHR(detailVO.getPrepareddate().toString());//會計年度
jsonDetailVO.setOBELNR(HRStr);//HRP憑證號
jsonDetailVO.setBUZEI("明細項號碼");//明細項號碼
jsonDetailVO.setOSHKZG("EAS(HRP)借貸標示");//EAS(HRP)借貸標示
jsonDetailVO.setLIFNR("供應商編碼");//供應商編碼
jsonDetailVO.setHKONT(detailVO.getOppositesubj().toString());//科目編碼
jsonDetailVO.setWRBTR("金額");//金額
jsonDetailVO.setKOSTL("成本中心");//成本中心
jsonDetailVO.setSGTXT(detailVO.getExplanation().toString());//摘要
jsonDetailVO.setFBKNUM("付款銀行碼");//付款銀行碼
jsonDetailVO.setFBKACT("付款賬號");//付款賬號
jsonDetailVOlList.add(jsonDetailVO);
}
}
// 表頭
HashMap<String, List> mapHead= new HashMap();
// 表體
HashMap<String, List> mapItem= new HashMap();
// 外層
HashMap<String, List> mapTable= new HashMap();
ArrayList list=new ArrayList<Map>();
mapHead.put("T_ACT_DOC_HEAD_I", jsonVoucherVOList);
mapItem.put("T_ACT_DOC_ITEM_I", jsonDetailVOlList);
list.add(mapHead);
list.add(mapItem);
mapTable.put("LT_TABLE", list);
//拼接參數
JsonConfig jsonCfg = new JsonConfig();
String jsonStr=null;
//判斷是否是list (LT_TABLE instanceof Collection || LT_TABLE instanceof Object[])
if (mapTable instanceof Collection) {
jsonStr = JSONArray.fromObject(mapTable, jsonCfg).toString();
} else {
jsonStr = JSONObject.fromObject(mapTable, jsonCfg).toString();
}
代碼(String to json)
sapResponse1="{'LT_TABLE':[{'T_ACT_DOC_HEAD_O':[{'SOURCE':'EAS(HRP)','BUKRS':'1000','GJAHR':'20161216:2','OBELNR':'100000000','BELNR':'0100000002','TYPE':'S','LOG':'成功!'},{'SOURCE':'EAS(HRP)','BUKRS':'2000','GJAHR':'20161216:2','OBELNR':'100000002','BELNR':'0100000005','TYPE':'E','LOG':'失敗!'}]}]}";
uap.json.JSONObject jsonObjout = new uap.json.JSONObject(sapResponse1);
Iterator itout = jsonObjout.keys();
for(int i=0;itout.hasNext();i++){
String LT_TABLE=itout.next().toString();
String sapResponse2 = jsonObjout.get(LT_TABLE).toString();
JSONArray jsonArray1 = JSONArray.fromObject(sapResponse2);
for(int ii=0;ii<jsonArray1.size();ii++ ){
Object sapResponse =jsonArray1.get(ii);
uap.json.JSONObject jsonObjin = new uap.json.JSONObject(sapResponse.toString());
Iterator itin = jsonObjin.keys();
for(int j=0;itin.hasNext();j++){
String T_ACT_DOC_HEAD_O=itin.next().toString();
String stringArray = jsonObjin.get(T_ACT_DOC_HEAD_O).toString();
JSONArray jsonArray = JSONArray.fromObject(stringArray);
for (int k = 0; k < jsonArray.size(); k++) {
JSONObject jsonObject = jsonArray.getJSONObject(k);
JsonResponseVO ResponseVO = (JsonResponseVO) JSONObject.toBean(jsonObject,JsonResponseVO.class);
String belnr = ResponseVO.getBELNR();
String gjahr = ResponseVO.getGJAHR();// 20161216:2
String year = gjahr.substring(0, 4);
String mouth = gjahr.substring(4, 6);
String[] split = gjahr.split(":");
String num = split[1];
String upsql = "update gl_voucher g set g.free2 = '"+belnr+"' where g.year = '"+year+"' and g.會計期間 = '"+mouth+"' and g.num = '"+num+"'";
dao.executeUpdate(upsql);
}
}
}
}