如何将ColdFusion生成的JSON字符串传入JavaScript函数?
你遇到的「Uncaught SyntaxError: Invalid or unexpected token」问题,本质是JSON字符串的双引号与HTML属性的单引号嵌套后,破坏了JavaScript的语法结构。Lucee的serializeJSON输出的标准JSON本身包含双引号,直接塞进href="javascript:..."的单引号里,浏览器解析时会把JSON里的双引号当成字符串结束标记,导致语法报错。下面给你几个经过验证的可行方案:
方案一:直接将JSON注入为JS对象(推荐)
最稳妥的方式是跳过字符串传递,直接把ColdFusion生成的JSON转换成JavaScript对象,再通过点击事件调用函数。这样完全避开引号冲突:
<script> // 直接把序列化后的JSON转为JS对象,无需额外解析 const userData = #serializeJSON(x)#; function myJSFunction(z) { console.log(z); } </script> <cfset x = {"firstName"="Bob", "lastName"="Smith"} /> <cfdump var="#x#" /> <cfset y = serializeJSON(x) /> <cfdump var="#y#" /> <cfoutput> <!-- 用onclick绑定事件,直接传递JS对象 --> <a href="javascript:void(0);" onclick="myJSFunction(userData);">点击测试(推荐方案)</a><br/> </cfoutput>
这种方式下,ColdFusion会直接把JSON输出为合法的JS对象字面量,JavaScript可以直接使用,不需要再调用JSON.parse(),代码更简洁也更安全。
方案二:对JSON做JS语境转义后传递字符串
如果必须通过href="javascript:..."传递字符串形式的JSON,需要对序列化后的JSON做JS语境的完整转义,推荐使用Lucee的encodeForJavaScript函数,它会处理引号、换行符等所有JS特殊字符:
<script> function myJSFunction(z) { // 把转义后的字符串解析为JS对象 const parsedData = JSON.parse(z); console.log(parsedData); } </script> <cfset x = {"firstName"="Bob", "lastName"="Smith"} /> <cfdump var="#x#" /> <!-- 先序列化JSON,再做JS编码 --> <cfset y = encodeForJavaScript(serializeJSON(x)) /> <cfdump var="#y#" /> <cfoutput> <a href="javascript:myJSFunction('#y#');">点击测试(字符串传递方案)</a><br/> </cfoutput>
encodeForJavaScript会把JSON里的双引号转义为\",同时处理其他可能导致语法错误的特殊字符,确保嵌入到单引号包裹的字符串中时,JS能正确解析。
为什么JSStringFormat无效?
JSStringFormat的作用仅仅是把字符串中的单引号替换为两个单引号,用来处理ColdFusion字符串里的单引号转义,但它没有针对JSON中的双引号和JS语境做全面处理,所以在这种场景下无法解决问题。
内容的提问来源于stack exchange,提问作者SharonG

