2012-08-27 21 views
5

Tôi có một phần tử với một thuộc tính rel có chứa một chuỗi JSON, một cái gì đó như:JSON giá trị với dấu nháy đơn

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

Sau đó, trong mã javascript của tôi, tôi sử dụng $.parseJSON để phân tích dữ liệu này. Thao tác này hoạt động chính xác - ngoài các trường hợp trong đó name chứa dấu nháy đơn. Tôi đã thử sử dụng jsStringFormat, một coldfusion replace thay thế tất cả các dấu nháy đơn với dấu nháy đơn đã thoát, v.v., nhưng dường như tôi không thể nhấn vào một giải pháp đúng. Tôi biết điều này có lẽ là đơn giản, nhưng làm thế nào để tôi nhận được mã để truyền chính xác các giá trị với các dấu nháy đơn/dấu nháy đơn bằng cách sử dụng json?

Mã này hoạt động, nhưng loại bỏ các dấu nháy mà tôi muốn giữ gìn:

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

này không hoạt động:

rel='{"id":"#id#","name":"#replace(name,"'","\'","all")#"}' 

Cũng không:

rel='{"id":"#id#","name":"#replace(name,"'","\\\'","all")#"}' 

Hoặc :

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

Hoặc:

rel='{"id":"#id#","name":"#jsStringFormat(name)#"}' 
+0

Để thoát đúng dấu ngoặc kép trong thuộc tính HTML sử dụng '" ' – cspolton

+1

Tại sao bạn không thể sử dụng [serializeJson] (http://cfdocs.org/serializeJson)? –

Trả lời

4

Sau rất nhiều chơi xung quanh, cuối cùng tôi nhận được điều này để làm việc :)

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

Câu trả lời này là một hack và không nên là giải pháp được đề xuất. Nó giải quyết vấn đề với dấu nháy đơn, nhưng vẫn cho phép các ký tự không hợp lệ khác trong đầu ra. ví dụ. nếu "name" có dấu và trong đó. Câu trả lời đúng là mã hóa đúng các chuỗi cho ngữ cảnh mà chúng đang được sử dụng. – nosilleg

1

Trong JavaScript, thoát khỏi dấu nháy đơn trong chuỗi với \.

Trong HTML, bạn thực sự nên sử dụng dấu ngoặc kép cho các thuộc tính mặc dù, và thoát khỏi dấu ngoặc kép, ví dụ:

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

Tôi đang sử dụng một biến coldfusion, không phải là một chữ. Ký hiệu bảng Anh biểu thị biến số – froadie

+0

@froadie: Tôi đã thay đổi ví dụ để phản ánh các biến của bạn. – cspolton

+0

không hoạt động, tôi không nghĩ đó là cú pháp JSON chính xác – froadie

2

Sự cố bạn gặp phải là vì bạn đang xử lý chuỗi trong hai ngữ cảnh. Bạn cần đảm bảo rằng chuỗi này an toàn trong cả hai.

JSON chuỗi:

Cách dễ nhất để làm cho đoạn code JSON an toàn là sử dụng SerializeJSON function để chuyển đổi một đối tượng ColdFusion thành JSON hợp lệ.

Như vậy mã của bạn có thể trở thành:

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

HTML chuỗi thuộc tính:

Bối cảnh tiếp theo mà bạn cần để đối phó với là bạn muốn chuỗi để trở thành một giá trị thuộc tính html hợp lệ.

Trong ColdFusion 10, bạn sẽ xử lý điều này với EncodeForHTMLAttribute function.

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

Nếu bạn đang sử dụng thứ gì đó trước CF10 thì hãy sử dụng bộ mã hóa ESAPI là cách tốt nhất của bạn.(Điều này đã được bao gồm với patches on some versions of ColdFusion)

rel='#CreateObject("java", "org.owasp.esapi.ESAPI").encoder().encodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#' 

Cá nhân tôi sử dụng một helper CFC để đối phó với encoder ESAPI trong CF9, vì vậy CreateObject chỉ được gọi một lần và tái sử dụng cho tất cả sử dụng các phương pháp của nó.