Struts2返回到浏览器的Json的文本格式一直带转义过的双引号和反斜杠

Struts2里面的Action对象的result的String Print出来的结果没有问题
{"id":"4028efd439422d260139422d2a530000","name":"department"}

在Struts.xml里面配置的
<package name="jsons" namespace="/" extends="json-default">
<action name="jsoninfo" class="personAction">
<result name="department" type="json">
<param name="root">result</param>  
</result>
</action>
</package>

然后再浏览器中输入对应的地址调用
返回的结果是:
"{\"id\":\"4028efd439422d260139422d2a530000\",\"name\":\"department\"}"

说明返回成果,但是文本的格式我用Jquery 的json完全不能解析这样子格式的对象,如果当做string类型来拆分过滤掉引号和反斜杠岂不有些多此一举,我只能想象可能是我哪里没有设置什么,请大家过目。

在$.ajax中返回的的是正在的JSON格式的对象,我认为是在最后的输出过程中做了一次我不想要的转义,求解。
例如:
JSONUtil.serialize(obj.toString());


我只想在浏览器中得到这样子的结果
{"id":"4028efd439422d260139422d2a530000","name":"department"}


问题补充:eval这种客户端转化的过程是我非常不想用的功能函数,浏览器的兼容性和性能也不是非常好,所以我还是期望能直接调用jquery的函数直接能得到正规的JSON格式的文件,不管是$.ajax 还是$.getJSON都能拿到JSON而不是无法辨认的对象。当然不通过eval方式。说白了就是在服务器端解决这个问题,还得用Struts。

回答: Struts2返回到浏览器的Json的文本格式一直带转义过的双引号和反斜杠

  1. 你可以看一下jQuery内部实现:

    parseJSON: function( data ) {
    		if ( typeof data !== "string" || !data ) {
    			return null;
    		}
    
    		// Make sure leading/trailing whitespace is removed (IE can't handle it)
    		data = jQuery.trim( data );
    		
    		// Make sure the incoming data is actual JSON
    		// Logic borrowed from http://json.org/json2.js
    		if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
    			.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
    			.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
    
    			// Try to use the native JSON parser first
    			return window.JSON && window.JSON.parse ?
    				window.JSON.parse( data ) :
    				(new Function("return " + data))();
    
    		} else {
    			jQuery.error( "Invalid JSON: " + data );
    		}
    	},



    1、如果你有JSON parse 就用它来进行解析:http://www.json.org/js.html
    2、否则 (new Function("return " + data))();

    这里注意data一定是字符串的,也就是说struts2传给前端的数据没有错,你要认识到这点;


    eval函数是浏览器内置的,它可以编译和执行任何javascript代码,因此相对来说不太安全,因此jQuery没有使用的:
    引用The eval function is very fast. However, it can compile and execute any JavaScript program, so there can be security issues.

struts2返回json格式数据,看看我的问题!!谢谢

  1. Q
    已经确定service层无错!
    action里这么写的:
    public void checkUserExist() throws Exception{
    		String param = request.getParameter("param");
    //		System.out.println("传入的参数值为:"+param);
    		users = new Users();
    		users.setLoginName(param);
    		//查询该用户名
    		int c = userService.checkUserHasExist(users);
    		System.out.println(c);
    		if(c!=0){
    			String info = "该用户名已存在,请重新输入!";
    			String status = "n";
    			JSONArray jsonObj = JSONArray.fromObject("[{info:"+info+",status:"+status+"}]");
    			writeJson(jsonObj.toString());
    		}else{
    			JSONArray jsonObj = JSONArray.fromObject("[{info:'该用户名可以使用!',status:'y'}]");
    			writeJson(jsonObj.toString());
    		}
    	}


    到页面的时候,直接显示出引用[{info:'该用户名可以使用!',status:'y'}]
    请问我应该怎么让他只显示,“该用户名可以使用”。
    其中的y和n表示数据提交是否正确!n表示提交错误,按说y应该提交正确了,但是还是红色字显示,意思是还是错误,虽然已经判断了是否存在用户名。
    我的jquery这么写的:
    if($(this).attr("ajaxurl")){
    						var inputobj=$(this);
    						inputobj.attr("valid",tipmsg.c);
    						$.fn.Validform.sn.showmsg(tipmsg.c,settings.tiptype,{obj:inputobj,type:1,sweep:settings.tipSweep},"hide");
    						$.ajax({
    							type: "POST",
    							url: inputobj.attr("ajaxurl"),
    							data: "param="+$(this).val()+"&name="+$(this).attr("name"),
    							dataType: "text",
    							success: function(s){
    								if(s=="y"){
    									inputobj.attr("valid","true");
    									errorobj=null;
    									$.fn.Validform.sn.showmsg(tipmsg.r,settings.tiptype,{obj:inputobj,type:2,sweep:settings.tipSweep},"hide");
    								}else{
    									inputobj.attr("valid",s);
    									errorobj=inputobj;
    									$.fn.Validform.sn.showmsg(s,settings.tiptype,{obj:inputobj,sweep:settings.tipSweep});
    								}
    							},


    JSP页面如下:
    <tr>
    					<td width="20%" align="right">
    						帐号:
    					</td>
    					<td style="width:205px;">
    						<input type="text" value="" name="users.loginName" class="inputcss" datatype="s6-18"  
    							ajaxurl="<%=basePath %>login/checkUserExist.action"  nullmsg="请输入用户名!" errormsg="帐号至少6个字符,最多18个字符,只能是数字字母下划线!" />
    					</td>
                		<td><div class="Validform_checktip">帐号至少6个字符,最多18个字符</div></td>
    				</tr>


    ajaxurl就是要检查的action。
    //表单数据是以POST方式提交过来;

    //注意json数据必须严格按如下格式输出:{"info":"demo info","status":"y"};
    //info: 输出提示信息;
    //status: 返回提交数据的状态,是否提交成功。“y”表示提交成功,“n”表示提交失败,在callback函数里可以根据该值执行相应的回调操作;
        echo '{
    "info":"数据已成功提交!",
    "status":"y"
    }';

    这是网上的那个方法,一行代码搞定全站的那个jquery,我现在要用来检查用户名是否存在!!唉
    搞了一个周末了!!!求高人
    问题补充:fire_wang 写道在success回调函数中用var data = eval(s);
    data就是你的json对象了,可以直接用data.info
    jsp页面还有这段引用$(".addUserform:eq(0)").Validform({
    tiptype:2,
    ajaxPost:true,
    callback:function(data){
    //返回数据data是json格式,{"info":"demo info","status":"y"}
    //info: 输出提示信息;
    //status: 返回提交数据的状态,是否提交成功。如可以用"y"表示提交成功,"n"表示提交失败,在ajax_post.php文件返回数据里自定字符,主要用在callback函数里根据该值执行相应的回调操作;
    //你也可以在ajax_post.php文件返回更多信息在这里获取,进行相应操作;
    var info = eval(data);
    //这里执行回调操作;
    if(info.status=="y"){
    setTimeout(function(){
    $.Hidemsg(); //公用方法关闭信息提示框;
    },2000);
    }
    }
    这里用了var data = eval(s);是否可以?
    问题补充:怎么让他在
    $(".addUserform:eq(0)").Validform({ 
    tiptype:2, 
    ajaxPost:true, 
    callback:function(data){ 
    //返回数据data是json格式,{"info":"demo info","status":"y"} 
    //info: 输出提示信息; 
    //status: 返回提交数据的状态,是否提交成功。如可以用"y"表示提交成功,"n"表示提交失败,在ajax_post.php文件返回数据里自定字符,主要用在callback函数里根据该值执行相应的回调操作; 
    //你也可以在ajax_post.php文件返回更多信息在这里获取,进行相应操作; 
    var info = eval(data); 
    //这里执行回调操作; 
    if(info.status=="y"){ 
    setTimeout(function(){ 
    $.Hidemsg(); //公用方法关闭信息提示框; 
    },2000); 
    } 
    }

    得到的就是json格式的数据呢?
  2. A
    在success回调函数中用var data = eval(s);
    data就是你的json对象了,可以直接用data.info

jqgrid+struts2返回的json数据良好,但是在页面却没有展示

  1. Q
    我的jsp页面代码如下,不复杂,只是想先把数据显示出来:
             
        jqgrid+struts2返回的json数据良好,但是在页面却没有展示

    这是我java的User.java
                 
     jqgrid+struts2返回的json数据良好,但是在页面却没有展示

    这是我的服务层代码
    jqgrid+struts2返回的json数据良好,但是在页面却没有展示

    这是我的action中处理数据的代码
           
     jqgrid+struts2返回的json数据良好,但是在页面却没有展示

    action中调用的sendString(String string)方法
    jqgrid+struts2返回的json数据良好,但是在页面却没有展示

    这是我在chrome中F12返回的良好的json数据
    jqgrid+struts2返回的json数据良好,但是在页面却没有展示

    这是我的页面最终的展示效果,什么数据都没有,悲催呀,,,,,
    jqgrid+struts2返回的json数据良好,但是在页面却没有展示


    坐等大神!!!!大神,where are you?
  2. A
    把你的dataType:"JSON"改为datatype:"JSON",以前版本都是这么用的,datatype小写

如何点击一个图片然后返回这个图片相关的所有信息..就是怎么用AJAX把客户端的信息传到后台然后再把值返回到浏览器

  1. Q
    如何点击一个图片然后返回这个图片相关的所有信息。。就是怎么用AJAX把客户端的ID传到后台然后再把值返回到浏览器,有多张图片,并且图片也都是从数据库读取地址的。我搜到可以用Jqery.ajax方法可以。。但是不知道怎么用,有哪位兄弟可以发个类似的例子吗??谢谢各位了
  2. A
    jQuery.ajax({
      type: "POST",
       url: "请求url",
       data: "参数",
       success: function(msg){
         //处理返回图片信息
    })
    

    你可以参考这jQuery的API

MVC 返回JSON 始终多出“” 双引号,应该如何解决?

  1. Q
    返回的结果
    "{ \"ShopList\":[ { \"StoreListId\":\"5\",\"UserInfoId\":\"3\",\"StoreCode\":\"001\",\"StoreName\":\"川菜馆(未央店)\",\"counts\":\"0\",\"receipts\":\"0.0000\",\"costsprice\":\"0.0000\",\"customerprofit\":\"0.0000\",\"nosettle\":\"0.0000\"}, { \"StoreListId\":\"6\",\"UserInfoId\":\"3\",\"StoreCode\":\"002\",\"StoreName\":\"川菜馆(莲湖店)\",\"counts\":\"0\",\"receipts\":\"0.0000\",\"costsprice\":\"0.0000\",\"customerprofit\":\"0.0000\",\"nosettle\":\"0.0000\"}, { \"StoreListId\":\"7\",\"UserInfoId\":\"3\",\"StoreCode\":\"003\",\"StoreName\":\"川菜馆(城南店)\",\"counts\":\"0\",\"receipts\":\"0.0000\",\"costsprice\":\"0.0000\",\"customerprofit\":\"0.0000\",\"nosettle\":\"0.0000\"} ]}"

    怎样,把返回的JSON两边的“”双引号去掉  还有中间的斜线去除!

    返回JSON 写法,将datatable 转成字符
     [HttpPost]
            public JsonResult ShopList(long userInfoId)
            {
                ELife.Common.Logs.WirteLog("Bug", Request.Url.ToString());
                try
                {
                    DataTable dt = shopList.GetShopList(userInfoId);
                    if (dt.Rows.Count > 0)
                    {
                        var jsonData = new JsonResult();
                        jsonData.Data = ToJson(dt);
                        jsonData.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                        jsonData.ContentType = "application/json";
                        return jsonData;
                    }
                    else
                    {
                        return Json(new { status = 0, Message = "没有数据", JsonRequestBehavior.AllowGet });
                    }
                }
                catch(Exception ex)
                {
                    ELife.Common.Logs.WirteLog("Bug", "异常:" + ex.Message);
                }
                return Json(new { status = 0, message = "请求数据失败!", JsonRequestBehavior.AllowGet });
            }


    转换datatable 的方法

    public static string ToJson(DataTable dt)
            {
                StringBuilder JsonString = new StringBuilder();
                if (dt != null && dt.Rows.Count > 0)
                {
                    JsonString.Append("{ ");
                    JsonString.Append("\"ShopList\":[ ");
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        JsonString.Append("{ ");
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            if (j < dt.Columns.Count - 1)
                            {
                                JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\",");
                            }
                            else if (j == dt.Columns.Count - 1)
                            {
                                JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\"");
                            }
                        }
                        /**/
                        /**/
                        if (i == dt.Rows.Count - 1)
                        {
                            JsonString.Append("} ");
                        }
                        else
                        {
                            JsonString.Append("}, ");
                        }
                    }
                    JsonString.Append("]}");
                    return JsonString.ToString();
                }
                else
                {
                    return null;
                }
            }

    请朋友们帮忙看看,谢谢 ! 我想要返回的JSON结果如下:

    "ShopList":[ 
                         { "StoreListId":"5","UserInfoId":"3","StoreCode":"001","StoreName":"川菜馆(未央店)","counts":"0","receipts":"0.0000","costsprice":"0.0000","customerprofit":"0.0000","nosettle":"0.0000"}, 
                        { "StoreListId":"6","UserInfoId":"3","StoreCode":"002","StoreName":"川菜馆(莲湖店)","counts":"0","receipts":"0.0000","costsprice":"0.0000","customerprofit":"0.0000","nosettle":"0.0000"}, 
                        { "StoreListId":"7","UserInfoId":"3","StoreCode":"003","StoreName":"川菜馆(城南店)","counts":"0","receipts":"0.0000","costsprice":"0.0000","customerprofit":"0.0000","nosettle":"0.0000"} 
                        ]
     另外,使用 “Newtonsoft.Json” 解析 datatable 也是一样,不知如何解决才好!
  2. A
    mvc返回json 不需要转换,  直接 return json(object) 就行了 
    object 可以传递datatable  不需要自己写tojson的方法

如何对TEXE1.TEXT中多行文本进行逐行查询数据库,并返回数据库中相匹配的文本字段对应的结果

  1. Q
    如何对TEXE1.TEXT中多行文本进行逐行查询数据库,并返回数据库中相匹配的文本字段对应的结果

    比如:TEXE1.TEXT中文本如下:(每行一题)
    我国《刑事诉讼法》规定,被告人的权利有?
    非全日制用工是《劳动合同法》规定的()。
    艾滋病检测实行()制?
    谁对子女具有法定抚养义务?


    数据库TK.mdb中表名tk中的“题目”字段含有上诉题目(也是每行一题)
    “答案”字段有对应题目的答案,想在希望能点击某按钮后程序能对TEXE1.TEXT中多行文本进行逐行查询数据库,并将每行文本题目对应的数据库中答案逐行显示到TEXT2.TEXT中

    请问该如何实现?
  2. A
    dim i as integer,w1 as string
    ww=split(text1.text,vbcrlf)
    for i=0 to ubound(ww)
    w1=w1 & iif(w1<>"",vbcrlf,"") & sql(ww(i))
    next
    text2.text=w1

    注:sql(ww(i))表示根据ww(i)从数据库中找到的对应的值

我把水晶报表转PDF后返回到浏览器上显示,在本地运行正常,但挂到IIS上访问就不能运行了,请问是什么原因

  1. Q
    我把水晶报表转PDF后返回到浏览器上显示,在本地运行正常,但挂到IIS上访问就不能运行了,请问是什么原因 
  2. A
    水晶,,,紙張,,呵呵,非常難控制,問問阿泰

十六进制发送文本格式接收,如何实现

  1. Q
    请问vb中,打开串口就会收到数据,数据格式为ASC码,然后用十六进制发送,接收到的是文本格式,请问这段代码怎么写,谢谢
  2. A
    通讯都是有协议的,接收,发送时分析,然后转换

JSON对象转成字符串之后,键和值有双引号

  1. Q
    如题,不是js,是java后台,JSON对象转成字符串之后,双引号应该怎么去掉
    搞了一个正则
    json.toString().replaceAll("\"(\\w+)\"(\\s*:\\s*)", "$1$2");

    可以去掉key的双引号,可是value的还在
  2. A
    有双引号才是对的 为什么要去掉

MFC 生成EXCEL 邮编文本格式问题

  1. Q
    我使用的是 _Application 来操作的

    for(i=1;i<8;i++)
    {
    for(j=0;j<8;j++)
    {
    tmp.Format("%c%d",arr[j],i);
    range1=sheet.GetRange(COleVariant(tmp),COleVariant(tmp)); 
    str.Format("%d",row[j]);   //row=mysql_fetch_row(result)
    range1.SetValue2(COleVariant(str));
    step++;
    }

    }

    如果是邮编是060454 输出的是60454 ,所以需要转为文本格式,请问如何实现
  2. A
    加"@"转换为文本格式,具体的去看我博客