Jquery 带撇号的JSON值

Jquery 带撇号的JSON值,jquery,json,coldfusion,apostrophe,Jquery,Json,Coldfusion,Apostrophe,我有一个带有rel属性的元素,它包含一个JSON字符串,类似于: rel='{"id":"#id#","name":"#name#"}' 然后,在我的javascript代码中,我使用$.parseJSON来解析这些数据。这是正确的-除了name包含撇号的情况之外。我尝试过使用jsStringFormat,一种coldfusionreplace,它用转义单引号替换所有单引号,等等,但我似乎找不到正确的解决方案。我知道这可能很简单,但是如何让代码使用json正确地传递带撇号/单引号的值呢 这段代

我有一个带有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")#"}'
或:

或:


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

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

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

经过一番周旋,我终于做到了:)


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

JSON字符串:

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

因此,您的代码可能会变成:

rel='#SerializeJSON({"id"=Variables.id,"name"=Variables.name})#'
HTML属性字符串:

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

在ColdFusion 10中,您将使用

如果您使用的是CF10之前的产品,那么使用ESAPI编码器是最佳选择。(这包括在附件中)


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

我使用的是coldfusion变量,而不是文字。英镑符号表示英镑variable@froadie:我更改了示例以反映您的变量。这不起作用,我认为如果您查看HTML源代码,您从coldfusion获得了什么输出?它在名称中的撇号处终止整个JSON字符串以正确转义HTML属性中的双引号使用
为什么您不能直接使用?这个答案是一个黑客攻击,不应该是推荐的解决方案。它解决了撇号的问题,但仍然允许在输出中使用其他无效字符。e、 g.如果“名称”中有符号和。正确的答案是为字符串所使用的上下文正确编码字符串。
rel="{"id":"#id#","name":"#name#"}"
rel='{"id":"#id#","name":"#replace(name,"'","&##39;","all")#"}'
rel='#SerializeJSON({"id"=Variables.id,"name"=Variables.name})#'
rel='#EncodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'
rel='#CreateObject("java", "org.owasp.esapi.ESAPI").encoder().encodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'