2012-08-27 97 views
5

que tiene un elemento con un atributo rel que contiene una cadena JSON, algo así como:valor JSON con apóstrofe

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

Entonces, en mi código Javascript, yo uso $.parseJSON para analizar estos datos. Esto funciona correctamente, además de los casos en que name contiene un apóstrofo. He intentado usar jsStringFormat, un coldfusion replace que reemplaza todas las comillas simples con comillas simples escapadas, etc., pero parece que no puedo encontrar una solución correcta. Sé que esto es probablemente simple, pero ¿cómo obtengo el código para pasar correctamente los valores con apostropes/comillas simples usando json?

funciona este código, pero elimina los apóstrofes, que me gustaría conservar:

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

Esto no funciona:

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

Tampoco:

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

O :

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

O:

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

Para escapar correctamente de las comillas dobles en los atributos HTML use '"' – cspolton

+1

¿Por qué no puede simplemente usar [serializeJson] (http://cfdocs.org/serializeJson)? –

Respuesta

4

Después de un montón de jugar un rato, finalmente conseguí que esto funcione :)

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

Esta respuesta es un truco y no debería ser la solución recomendada. Resuelve el problema con el apóstrofo, pero aún permite otros caracteres no válidos en la salida. p.ej. si "nombre" tiene un ampersand en él. La respuesta correcta es codificar adecuadamente cadenas para el contexto en el que se utilizan. – nosilleg

1

En JavaScript, escapar comillas simples en cadenas con \.

En HTML, que realmente debe utilizar comillas dobles para los atributos sin embargo, y escapar de las comillas dobles, por ejemplo:

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

Estoy usando una variable ColdFusion, no es literal. Los signos de la libra denotan la variable – froadie

+0

@froadie: he cambiado el ejemplo para reflejar sus variables. – cspolton

+0

que no funciona, no creo que sea correcta sintaxis JSON – froadie

2

El problema es que se trata de una cadena en dos contextos. Debes asegurarte de que la cuerda sea segura en ambos.

JSON cadena:

La manera más fácil de hacer que el código JSON segura es utilizar SerializeJSON function para convertir un objeto de ColdFusion en JSON válida.

lo tanto su código podría llegar a ser:

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

HTML cadena del atributo:

El siguiente contexto que tiene que tratar es que desea la cadena a un valor de atributo HTML válido.

En ColdFusion 10 manejaría esto con EncodeForHTMLAttribute function.

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

Si está utilizando algo anterior a CF10, entonces usar el codificador ESAPI es su mejor opción.(Esto se incluyó con patches on some versions of ColdFusion)

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

Yo personalmente uso un ayudante de CFC para hacer frente a codificador ESAPI en CF9, por lo que sólo se CreateObject se llama una vez y volver a utilizar para todos los usos de sus métodos.