带有撇号的JSON值

6

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

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属性中正确转义双引号,请使用" - cspolton
1
为什么你不能只是使用 serializeJson - Peter Boughton
3个回答

4

经过多次尝试,我终于让它成功了 :)

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

这个答案是一个hack,不应该被推荐作为解决方案。它解决了撇号的问题,但仍允许输出中存在其他无效字符,例如如果“name”中有一个&符号。正确的答案是根据使用环境适当地对字符串进行编码。 - nosilleg

2
你遇到的问题是因为你正在处理一个字符串,但在两个上下文中使用了它。你需要确保这个字符串在两个上下文中都是安全的。 JSON字符串: 最简单的使代码符合JSON规范的方法是使用 SerializeJSON函数将ColdFusion对象转换为有效的JSON格式。
因此,你的代码可以变成这样:
rel='#SerializeJSON({"id"=Variables.id,"name"=Variables.name})#'

HTML属性字符串:

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

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

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

如果您使用的是CF10之前的版本,则使用ESAPI编码器是最好的选择。(这已经包含在某些ColdFusion版本补丁中)
rel='#CreateObject("java", "org.owasp.esapi.ESAPI").encoder().encodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'

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

1

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

在HTML中,应该使用双引号来定义属性,并转义双引号,例如:

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

我正在使用一个ColdFusion变量,而不是文字。井号表示该变量。 - froadie
@froadie:我已经更改了示例以反映您的变量。 - cspolton
那行不通,我认为它不是正确的JSON语法。 - froadie
如果您查看HTML源代码,从ColdFusion中得到了什么输出? - cspolton
它在名称的撇号处终止整个JSON字符串。 - froadie
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接