• 前后台JSON传值得一个问题和异常处理net.sf.json.JSONException: Unquotted string '"name"'


      项目中做导入的时候遇到个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>();

  • 相关阅读:
    js 比较好的博客
    网络相关
    gulp学习笔记--简单入门
    数组和对象的复制
    seajs学习笔记
    art-template引擎模板
    angularJS中的$apply(),$digest(),$watch()
    CMD和AMD
    通过script标签实现跨域
    jQuery基础知识
  • 原文地址:https://www.cnblogs.com/goloving/p/8027603.html
Copyright © 2020-2023  润新知