2012-08-27 145 views
5

JSON值我有一個包含JSON字符串,就像一個相對屬性的元素:與撇號

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

然後,在我的javascript代碼,我用$.parseJSON解析這個數據。這工作正常 - 除了name包含撇號的情況。我試過使用jsStringFormat,一個coldfusion replace,用單引號等代替所有單引號,但我似乎無法找到正確的解決方案。我知道這可能很簡單,但我如何讓代碼正確傳遞值與使用json的apostropes /單引號?

此代碼的工作,但消除我想保留它撇號:

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

要正確地轉義HTML屬性中的雙引號,請使用'"' – cspolton

+1

爲什麼不能只使用[serializeJson](http://cfdocs.org/serializeJson)? –

回答

4

經過大量的玩弄,我終於得到了這個工作:)

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

這個答案是黑客,不應該是推薦的解決方案。它用撇號解決了這個問題,但仍然允許輸出中的其他無效字符。例如如果「名稱」中有&符號。正確的答案是正確編碼正在使用的上下文字符串。 – nosilleg

1

在JavaScript中,逃避串單引號與\

在HTML中,你應該使用屬性的雙引號,雖然,逃脫雙引號,例如:

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

我正在使用coldfusion變量,而不是文字。英鎊符號表示變量 – froadie

+0

@froadie:我已更改示例以反映您的變量。 – cspolton

+0

不起作用,我不認爲它是正確的JSON語法 – froadie

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編碼器,使創建對象只能調用一次,對於它的方法所有用途重複使用。