前后台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>();
复制代码

 

posted @   古兰精  阅读(19679)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示