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 ));
De http://www.php.net/manual/en/function.json-encode.php#100565
Dicho esto, las comillas "producirán un JSON no válido, pero esto es solo un problema si estás usando json_encode () y solo esperas que PHP escape de forma mágica a tus cotizaciones. Necesitas hacer el escape por tu cuenta.
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'');
Use json_encode($json_array, JSON_HEX_QUOT);
desde php 5.3: http://php.net/manual/en/json.constants.php