項目中做導入的時候遇到個bug,用JSON.stringify()序列號json對象傳給后台;然后后台通過getPatameter()獲取值時,前台的英文引號變成了中文引號。
原來代碼如下:(自己排查發現就算是英文的時候也是如此)
//提交事件
$("#submitButton").bind("click",function(){ if($("#addForm").valid()){ var jsonStr = {}; $("#itemTable").find("input[lang='userAdd']").each(function(index,obj){ var nameAttr = $(obj).attr("id").trim(); var valueAttr = $('#'+nameAttr).combobox('getValue').trim(); if (valueAttr != "" && valueAttr != undefined) { jsonStr[valueAttr] = nameAttr; } }); var json = new Object(); json.name = "ss"; json.age = "12"; var data = JSON.stringify(json); var att = {}; att["password"] = $("#text_pwd").val(); att["organization"] = $("#text_organization").combotree("getValue"); $(this).attr("disabled","disabled"); Loading(true,"<s:text name='cems.soft.progress.handling'></s:text>");//遮罩提示
$.doAjax({ url:'${basePath}/user/userAction_userAdd.do', data:{"data":data,"arrdata":JSON.stringify(att)}, async:true, success:function(responseText){
在后台獲取時,前台的英文引號,在后台變成了中文引號,導致JSON解析出錯,報異常:net.sf.json.JSONException: Unquotted string '”ss”'
/** * 映射字段 */
public void userAdd(){ log.info("用戶批量導入_PBEG"); this.msg=RESULT_FAIL; long startTime = System.currentTimeMillis();//獲取當前時間
String initPassword = ""; File file = null; List<User> list = new ArrayList<User>(); List<UserCache> userCaches = new ArrayList<UserCache>(); List<String> failedFailName = new ArrayList<String>(); Organization default_org = null; try { String data = getRequest().getParameter("data"); String arrdata =getRequest().getParameter("arrdata"); JSONObject jsonData = JSONObject.fromObject(data); JSONObject jsonArrdata = JSONObject.fromObject(arrdata); String arrPassword = jsonArrdata.containsKey("password") ? jsonArrdata.getString("password") : ""; String arrOrganization = jsonArrdata.containsKey("organization") ? jsonArrdata.getString("organization") : "";

解決方案:
經過幾次json轉換的嘗試,發現結果均是如此,所以最后決定采用注入的方式處理。
//提交事件
$("#submitButton").bind("click",function(){ if($("#addForm").valid()){ var jsonStr = {}; $("#itemTable").find("input[lang='userAdd']").each(function(index,obj){ var nameAttr = $(obj).attr("id").trim(); var valueAttr = $('#'+nameAttr).combobox('getValue').trim(); if (valueAttr != "" && valueAttr != undefined) { jsonStr[valueAttr] = nameAttr; } }); var data = JSON.stringify(jsonStr); var att = {}; att["password"] = $("#text_pwd").val(); att["organization"] = $("#text_organization").combotree("getValue"); $(this).attr("disabled","disabled"); Loading(true,"<s:text name='cems.soft.progress.handling'></s:text>");//遮罩提示
$.doAjax({ url:'${basePath}/user/userAction_userAdd.do', data:{"data":data,"arrdata":JSON.stringify(att)}, async:true, success:function(responseText){
后台:采用注入方式
private String data; public String getData() { return data; } public void setData(String data) { this.data = data; } private String arrdata; public String getArrdata() { return arrdata; } public void setArrdata(String arrdata) { this.arrdata = arrdata; } /** * 映射字段 */
public void userAdd(){ log.info("用戶批量導入_PBEG"); this.msg=RESULT_FAIL; long startTime = System.currentTimeMillis();//獲取當前時間
String initPassword = ""; File file = null; List<User> list = new ArrayList<User>(); List<UserCache> userCaches = new ArrayList<UserCache>(); List<String> failedFailName = new ArrayList<String>(); Organization default_org = null; try { //String data = getRequest().getParameter("data"); //String arrdata =getRequest().getParameter("arrdata");
JSONObject jsonData = JSONObject.fromObject(data); JSONObject jsonArrdata = JSONObject.fromObject(arrdata); String arrPassword = jsonArrdata.containsKey("password") ? jsonArrdata.getString("password") : ""; String arrOrganization = jsonArrdata.containsKey("organization") ? jsonArrdata.getString("organization") : ""; String excelPath = getServletContext().getRealPath(USEREXCELTEMPLATE_DOWNLOADPATH+USEREXCELTEMPLATE_FILE); file = new File(excelPath); if(!file.exists() && !file.isDirectory()){ this.msg = "readErr"; throw new IllegalStateException("用戶批量導入-->用戶導入臨時文件不存在!"); } List<UserExport> userExports = new ArrayList<UserExport>();

