在java中转义单个引号并尝试在json blob中呈现转义的引号

在java中转义单个引号并尝试在json blob中呈现转义的引号,java,javascript,regex,grails,escaping,Java,Javascript,Regex,Grails,Escaping,在我的web应用程序中,我试图在服务器上构建一个JSON字符串,然后将其传递给客户端,以便使用客户端javascript处理它。但是,当JSON字符串包含一个引号时,javascript会中断 JSON基本上是一个映射列表,它在mappings变量中传递到我的GSP页面。然后,我计算字符串以将其转换为javascript对象: var json = eval('(${mappings})'); 当计算映射时,完整的javascript表达式如下所示: var json = eval('([{"

在我的web应用程序中,我试图在服务器上构建一个JSON字符串,然后将其传递给客户端,以便使用客户端javascript处理它。但是,当JSON字符串包含一个引号时,javascript会中断

JSON基本上是一个映射列表,它在
mappings
变量中传递到我的GSP页面。然后,我计算字符串以将其转换为javascript对象:

var json = eval('(${mappings})');
当计算
映射时,完整的javascript表达式如下所示:

var json = eval('([{"targetId":123,"targetName":"this isn't going to work"}])');
很明显,在这种情况下,当
映射
包含一个引号(“…这不起作用…”)时,JSON字符串会提前终止,浏览器会报告javascript错误

我本以为这很容易解决,但是在java方面,当我尝试使用

json.replaceAll("'", "\\'")
我明白了:

"...this isn't going to work..."
"...this isn\\'t going to work..."
i、 它一点也没变

如果我试图双倍避开反斜杠,即

json.replaceAll("'", "\\\\'")
我明白了:

"...this isn't going to work..."
"...this isn\\'t going to work..."

这也不正确。如何用单个反斜杠和引号替换单个引号,以便在客户端上呈现字符串时可以正确计算该字符串?

此处不需要正则表达式。只需使用
String#replace
方法来转义单引号:

String repl = "this isn't going to work".replace("'", "\\'");
//=> this isn\'t going to work

不要使用
eval
。如果要在JavaScript中插入JSON字符串,只需插入它即可

var json = ${mappings};

不需要转义,字符串已经是有效的JavaScript。(如果您确实需要解析JSON,请使用
JSON.parse()
而不是
eval()
。这会显著降低代码的速度。)

为什么不使用
${mappings.encodeAsJavaScript()}
编解码器的存在是有原因的。请看:但无论如何,执行eval()都是一种浪费。(见阿马丹的回答)。