2011-09-18 48 views
19

Estoy creando una cadena JSON desde una matriz PHP. Lo he codificado usando json_encode().PHP JSON String, escape Citas dobles para la salida JS

$data = array(
    'title' => 'Example string\'s with "special" characters' 
); 

$data = json_encode($data); 

$data se localiza utilizando wp_localize_script() y es accesible a través de un data variable global.

En el archivo JS que puede acceder a la información por la siguiente:

var data  = data.replace(/"/g, '"'), 
    jsonData = jQuery.parseJSON(data); 

console.log(jsonData); 

Esto se traduce en una producción de:

{ "title":"Example string's with "special" characters" } 

Introducción que se traducen en http://jsonlint.com/ devuelve un error. Al eliminar las comillas dobles alrededor de "especial", se valida la cadena.

¿Cuál es la mejor manera de crear una cadena JSON desde PHP y escaparla adecuadamente para usarla en un archivo JS?

Respuesta

8

De http://www.php.net/manual/en/function.json-encode.php#100565

Dicho esto, cita "producirá JSON válido, pero esto es sólo un problema si está utilizando json_encode() y sólo cabe esperar PHP para escapar mágicamente sus cotizaciones. Es necesario hacer . escapar del mismo

+30

¿No puede esperar que json_encode produzca un json válido? No contrataría a este desarrollador –

+7

@Joti Debe ser nuevo en PHP y luego: P –

+5

esta respuesta, aunque se ha marcado como aceptada, no responde la pregunta. OP pregunta: ¿cuál es la mejor manera de crear una cadena JSON desde PHP y escaparla adecuadamente para usarla en un archivo JS?Esta respuesta dice que debes escaparte, pero no proporciona la mejor manera de hacerlo. – Alex

18

Otra forma sería la de codificar las comillas usando htmlspecialchars:

$json_array = array(
    'title' => 'Example string\'s with "special" characters' 
); 

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8'); 
+11

¿No va a convertir '" 'a' " '? – colllin

+1

que no funciona para m – WonderLand

+0

Buen consejo, funciona bien con el atributo' data-'(html5) :) Gracias! +1 –

13

Utilice json_encode ($ json_array, JSON_HEX_QUOT); a partir de PHP 5.3: http://php.net/manual/en/json.constants.php

+0

Estoy formateando mi propia json y soy solo insertando el valor como "{\" clave \ ":". json_encode ($ value). "}" donde $ value es una cadena con comillas. Esta fue la solución más simple que funcionó para mí. JSON.parse (x) funciona perfectamente en este caso – Alex

15

I succefully acabo de hacer esto:

$json = str_replace("\u0022","\\\\\"",json_encode($phpArray,JSON_HEX_QUOT)); 

json_encode() por defecto escapará a "\". Pero todavía está mal JSON para json.PARSE(). Entonces al agregar la opción JSON_HEX_QUOT, json_encode() reemplazará " con \u0022. json.PARSE() todavía no quiere \u0022. Entonces, tenemos que reemplazar \u0022 con \\". El \\\\\" se escapó \\".

NOTA: puede agregar la opción JSON_HEX_APOS para reemplazar la comilla simple con el valor HEX de unicode si tiene un problema de javascript con comillas simples.

ejemplo: json_encode($phpArray, JSON_HEX_APOS|JSON_HEX_QUOT));

+0

esto funcionó para mí Gracias – West55

+3

PHP: $ encodedData = json_encode ($ phpArray, JSON_HEX_APOS | JSON_HEX_QUOT); JS:... JSON.parse (' '); Perfecto. – pirs

+0

¡Sí! Este simplemente hizo el truco :) Gracias por salvarme el día :) –

1

Me acabo de encontrar con este problema y el problema real era que se me olvidó añadir una cabecera adecuada application/json antes de escupirlo los datos JSON reales.

header('Content-Type: application/json'); 
Cuestiones relacionadas