【问题标题】:Escaping a single quote in java and trying to render the escaped quote in a json blob在 java 中转义单引号并尝试在 json blob 中呈现转义的引号
【发布时间】:2014-08-29 07:04:11
【问题描述】:

在我的 Web 应用程序中,我试图在服务器上构建一个 JSON 字符串,然后将其传递给客户端,以便我可以使用一些客户端 javascript 来处理它。这在大多数情况下都有效,但是当 JSON 字符串包含单引号时,javascript 会中断。

JSON 基本上是一个地图列表,它通过mappings 变量传递到我的GSP 页面。然后我评估字符串以将其转换为 javascript 对象:

var json = eval('(${mappings})');

mappings 被计算时,完整的 javascript 表达式看起来像这样:

var json = eval('([{"targetId":123,"targetName":"this isn't going to work"}])');

很明显,在这种情况下,当mappings 包含一个单引号(“...this isn't going to work...”)时,JSON 字符串会提前终止,并且浏览器报告 javascript 错误。

我原以为这很容易解决,但是在 java 方面,当我尝试使用 \' 替换 '

json.replaceAll("'", "\\'")

我明白了:

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

即它根本没有改变!

如果我尝试双重转义反斜杠,即

json.replaceAll("'", "\\\\'")

我明白了:

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

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

【问题讨论】:

  • 为什么不使用${mappings.encodeAsJavaScript()} 编解码器的存在是有原因的。见:grails.org/doc/2.3.1/guide/security.html 但是做 eval() 无论如何都是浪费。 (见 Amadan 的回答)。

标签: java javascript regex grails escaping


【解决方案1】:

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

var json = ${mappings};

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

【讨论】:

    【解决方案2】:

    这里不需要正则表达式。只需使用String#replace 方法转义单引号即可:

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

    Code Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2011-10-04
      • 2016-10-02
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多