2011-11-04 21 views
7

En plantillas de Django que han impreso los datos de esta manera:de análisis JSON - comilla simple dentro de nombre

P.place = '{{place.json|safe}}'; 

A continuación, en el archivo JavaScript estoy de pelado de esa manera:

place = JSON.parse(P.place); 

Todo está bien para los datos por el estilo:

{"category": "Cars", "name": "Z"} 

Debido a que la cadena se ve así:

P.place = '{"category": "Cars", "name": "Z"}' 

Entonces, puedo analizarlo usando el método JSON.parse que acepta cadenas como entrada.

El problema es que cuando llegue a los datos así:

{"category": "Cars", "name": "Wojtek's Z"} 

Debido a que la cadena de entrada para JSON analizador se ve así:

'{"category": "Cars", "name": "Wojtek' 

no puedo escapar comilla simple dentro cadena JSON, porque entonces JSON la cadena se vuelve inválida Por la misma razón, no puedo reemplazar las comillas que rodean por el doble y escapar las comillas dobles dentro de la cadena JSON.

Mi solución que parece:

En plantilla HTML:

P.place = {{place.json|safe}}; 

Luego, en JavaScript

var place = JSON.stringify(P.place); 
place = JSON.parse(place); 

Funciona, pero no es óptima en mi humilde opinión solución.

¿Cómo resolver este problema de una manera más astuta?

+0

DEBE solicitar un apóstrofo dentro de JSON, no hay forma de evitarlo. Pero generalmente puede escapar, si define un objeto usando "\". O si lo prefieres, escapa unicode \ u0027 (creo). – StaxMan

+0

No puede hacer eso, revise jsonlint.com y json.org –

+0

No puede hacer qué? Echa un vistazo a la especificación json. – StaxMan

Respuesta

8

puedo pensar en dos posibilidades:

Crear un elemento de guión de tipo application/json, se inyectan sus datos de plantillas en él, a continuación, leer sus datos, por ejemplo.

<script id="place-json" type="application/json"> 
    {{place.json|safe}} 
</script> 
<script type="application/javascript"> 
    P.place = $('#place-json').text(); 
</script> 

O, escapen manualmente las comillas simples antes de inyectar la cadena, p. Ej.

simplejson.dumps(yourdata).replace("'", r"\'") 
+0

¡Gracias por la respuesta! Sin embargo, creo que esta solución es más sobrecargada que mía. Por cierto, no podemos usar id en el elemento script. –

+0

¿Por qué no puedes usar el ID dentro del elemento script? –

+0

http://stackoverflow.com/questions/2741441/giving-the-script-tag-an-id para obtener información sobre la identificación en el elemento script. También sospecho que es menos sobrecargado que stringifying y luego vuelve a analizar el JSON, aunque, por supuesto, debe comparar y ver. –

Cuestiones relacionadas