【问题标题】:JSON value with apostrophe [duplicate]带撇号的 JSON 值 [重复]
【发布时间】:2012-08-22 07:46:35
【问题描述】:

我有一个包含 JSON 字符串的 rel 属性的元素,类似于:

rel='{"id":"#id#","name":"#name#"}'

然后,在我的 javascript 代码中,我使用 $.parseJSON 来解析这些数据。这可以正常工作 - 除了name 包含撇号的情况。我试过使用jsStringFormat,一个coldfusion replace,用转义的单引号等替换所有单引号,但我似乎无法找到正确的解决方案。我知道这可能很简单,但是如何让代码使用 json 正确传递带有撇号/单引号的值?

此代码有效,但消除了我想保留的撇号:

rel='{"id":"#id#","name":"#replace(name,"'","","all")#"}'

这不起作用:

rel='{"id":"#id#","name":"#replace(name,"'","\'","all")#"}'

也没有:

rel='{"id":"#id#","name":"#replace(name,"'","\\\'","all")#"}'

或者:

rel='{"id":"#id#","name":"#replace(name,"'",""","all")#"}'

或者:

rel='{"id":"#id#","name":"#jsStringFormat(name)#"}'

【问题讨论】:

  • 要正确转义 HTML 属性中的双引号,请使用 "
  • 为什么不能直接使用serializeJson

标签: jquery json coldfusion apostrophe


【解决方案1】:

玩了这么多,终于搞定了 :)

rel='{"id":"#id#","name":"#replace(name,"'","&##39;","all")#"}'

【讨论】:

  • 这个答案是一个hack,不应该是推荐的解决方案。它解决了撇号的问题,但仍然允许输出中出现其他无效字符。例如如果“名称”中有一个&符号。正确的答案是正确地对字符串进行编码以适应它们所使用的上下文。
【解决方案2】:

您遇到的问题是因为您在两个上下文中处理一个字符串。您需要确保字符串在两者中都是安全的。

JSON 字符串:

使代码 JSON 安全的最简单方法是使用 SerializeJSON function 将 ColdFusion 对象转换为有效的 JSON。

因此您的代码可能变成:

rel='#SerializeJSON({"id"=Variables.id,"name"=Variables.name})#'

HTML 属性字符串:

您需要处理的下一个上下文是您希望字符串成为有效的 html 属性值。

在 ColdFusion 10 中,您可以使用 EncodeForHTMLAttribute function 处理此问题。

rel='#EncodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'

如果您使用的是 CF10 之前的版本,那么最好使用 ESAPI 编码器。 (这包含在patches on some versions of ColdFusion 中)

rel='#CreateObject("java", "org.owasp.esapi.ESAPI").encoder().encodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'

我个人使用辅助 CFC 来处理 CF9 中的 ESAPI 编码器,因此 CreateObject 只被调用一次,并在其方法的所有使用中重复使用。

【讨论】:

    【解决方案3】:

    在 JavaScript 中,使用 \ 转义字符串中的单引号。

    在 HTML 中,你确实应该对属性使用双引号,并转义双引号,例如:

    rel="{"id":"#id#","name":"#name#"}"
    

    【讨论】:

    • 我使用的是冷融合变量,而不是文字。井号表示变量
    • @froadie:我已更改示例以反映您的变量。
    • 那行不通,我不认为这是正确的 JSON 语法
    • 如果你查看 HTML 源代码,你从 Coldfusion 得到什么输出?
    • 它在名称中的撇号处终止整个 JSON 字符串
    猜你喜欢
    • 2015-09-14
    • 2011-12-01
    • 2016-08-24
    • 1970-01-01
    • 2018-08-14
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多