我有一个包含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)#"}'
答案 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#"}"