print json_encode json_decode escape characters array php escaping json double-quotes

json_encode - print json php



PHP JSON String, escape Double Quotes para salida JS (6)

Acabo de encontrarme con este problema y el problema real fue que olvidé agregar un encabezado de aplicación / json adecuado antes de escupir los datos reales de JSON.

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

Estoy creando una cadena JSON a partir de una matriz de PHP. Lo he codificado usando json_encode() .

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

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

En el archivo JS puedo acceder a la información de la siguiente manera:

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

Esto resulta en una salida de:

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

Al ingresar ese resultado en http://jsonlint.com/ muestra un error. Eliminar las comillas dobles alrededor de "especial" valida la cadena.

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


Acabo de hacer esto con éxito:

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

json_encode() por defecto escapará " a /" . Pero sigue siendo incorrecto JSON para json.PARSE() . Entonces, al agregar la opción JSON_HEX_QUOT , json_encode() reemplazará " con /u0022 . json.PARSE() todavía no le gustará /u0022 . Entonces, necesitamos reemplazar /u0022 con //" . El /////" se escapa //" .

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

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



Esta es una solución que se ocupa de las comillas simples y dobles:

<?php $php_data = array("title"=>"Example string''s with /"special/" characters"); $escaped_data = json_encode( $php_data, JSON_HEX_QUOT|JSON_HEX_APOS ); $escaped_data = str_replace("/u0022", "///"", $escaped_data ); $escaped_data = str_replace("/u0027", "//'", $escaped_data ); ?> <script> // no need to use JSON.parse()... var js_data = <?= $escaped_data ?>; alert(js_data.title); // should alert `Example string''s with "special" characters` </script>


Otra forma sería codificar las citas utilizando htmlspecialchars :

$json_array = array( ''title'' => ''Example string/'s with "special" characters'' ); $json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, ''UTF-8'');