带撇号的JSON值

时间:2012-08-27 19:38:23

标签: jquery json coldfusion apostrophe

我有一个包含jSON字符串的rel属性的元素,如:

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

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

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

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)#"}'

3 个答案:

答案 0 :(得分:4)

经过大量的游戏,我终于得到了这个工作:)

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

答案 1 :(得分: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只被调用一次并重用于其方法的所有用途。

答案 2 :(得分:1)

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

在HTML中,您应该使用双引号作为属性,并转义双引号,例如:

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