弄一个隐藏元素,把data赋值给这个隐藏元素的html。 然后在取出这个隐藏元素的html,然后用JSON.parse(html);获得data对象 var $span=$('<span type="display:none;"></span>'); $span.html("{"id":1}"); console.log(JSON.parse($span.html()));
这个分两种情况,就是看你是不是非得在javascript中直接引用变量。 如果这个变量只是在页面提交时刷新一次的话,那么LZ可以按照4L的方法,先用一个input来接收这个变量,然后再在javascript中直接引用这个input控件的value属性。如果因为种种原因(比方说这个json是一个Ajax的返回),不能用上述方法的话,就得自己编程实现了: 写一个静态java方法(譬方说叫Test.convert(String s)),对于键盘上的所有键,除了换行,反斜杠,单引号,双引号,Tab键之外,保持原状不变,对于其它键,包括非英文字符,统一转成\uxxxx这样的十六进制形式,然后在你的接收参数的部分 var data = "<s:property value='jsonp'/>"; 不要用struct标签,直接从request中取参数并用你刚才写的转换方法 var data = "<%=Test.convert(request.getParameter("jsonp"))%>"; 就行了
完全可以直接 打开页面 ajax 请求 返回json数据
<s:property/>标签帮你做了HTML转义,把"转义成了",你可以不用这个<s:property/>标签,而是用最原始的var data = "<%=jsonp%>";或者如6楼所说escapeHtml="false"
我觉得问题主要是处在LZ错误的使用了s:properties这个标签。这个struct 2的标签应该是在HTML正文 -- 如<td><s:properties ...></td>
或者HTML的Tag的标签的属性部分 -- 如<input type="text" value=<s:properties...> >
使用的,所以它会把里面的内容直接用HTML正文的编码方式进行编码:如把双引号"替换为",
把非Ascii的字符如汉字,用&#字符的Unicode码的10进制表示;进行替换--这样替换后的内容,可以显示在任何编码方式的HTML正文中,哪怕这个HTML是用ISO8859-1的方式编码的。而在javaScript片段中,对于字符串是有另外一套编码规则的:
对于一些需要转义的字符,如双引号",单引号',反斜杠\,以及一些非Ascii码(如中文),
它是用\u字符的Unicode码的16进制表示方式的4位长串(若不满4位,前面补0)的方式表达的
(当然若javascript代码中,若使用双引号来括一个字符串,则字符串内容中的单引号可转可不转,反之亦然)所以嘛,LZ要么直接把这个字符串用s:property嵌入到HTML正文中,要么另外找一个方法将它编码成javascript能认识的字符串模式
然后在取出这个隐藏元素的html,然后用JSON.parse(html);获得data对象
var $span=$('<span type="display:none;"></span>');
$span.html("{"id":1}");
console.log(JSON.parse($span.html()));
如果这个变量只是在页面提交时刷新一次的话,那么LZ可以按照4L的方法,先用一个input来接收这个变量,然后再在javascript中直接引用这个input控件的value属性。如果因为种种原因(比方说这个json是一个Ajax的返回),不能用上述方法的话,就得自己编程实现了:
写一个静态java方法(譬方说叫Test.convert(String s)),对于键盘上的所有键,除了换行,反斜杠,单引号,双引号,Tab键之外,保持原状不变,对于其它键,包括非英文字符,统一转成\uxxxx这样的十六进制形式,然后在你的接收参数的部分
var data = "<s:property value='jsonp'/>";
不要用struct标签,直接从request中取参数并用你刚才写的转换方法
var data = "<%=Test.convert(request.getParameter("jsonp"))%>";
就行了