json_unescaped_unicode json_encode ejemplo array php jquery

php - json_encode - json_unescaped_unicode



php json_encode & jquery parseJSON problema de comillas simples (5)

Busqué y leí la mayoría de los temas relacionados, pero no eran lo que estaba buscando.

Tengo una cadena enocded JSON con la función json_encode PHP:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D''Onofrio"],"year":1987}

También estoy trabajando con jQuery para poner los valores en los campos apropiados, en el caso de las pruebas, hice lo siguiente:

<script> var obj = jQuery.parseJSON(''<?=$data?>''); console.log(obj); </script>

Supongamos que $ data es esto:

$data = <<<END {"casts":["Matthew Modine","Adam Baldwin","Vincent D''Onofrio"],"year":1987} END;

Lo que produce la consola Google Chrome en este caso:

Uncaught SyntaxError: Unexpected identifier

Sin embargo, cuando realizo un cambio en la cadena codificada JSON - agregando Backslash a comillas simples:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D/'Onofrio"],"year":1987}

La salida de la consola es normal

Object {casts: Array[3], year: 1987} casts: Array[3] year: 1987

La pregunta: ¿se espera este error en la consola? ¡Creo que escapar o reemplazar '' por /' estará muy sucio!

ACTUALIZADO

En realidad , el valor de $ data proviene de un json_encode($var) y $ var es una matriz.

$data = json_encode($var);


Sin embargo, cuando realizo un cambio en la cadena codificada JSON, agregue la barra invertida a una comilla simple

Eso lo escapa en la cadena de PHP literal. Luego se inserta en la cadena de PHP como un simple '' .

Si quieres escapar de él antes de insertarlo en JavaScript, entonces debes agregar barras a la cadena que obtienes de json_encode (o más bien, ya que no estás usando esa cadena JSON que debes construir a mano) .

Eso es más trabajo que necesitas. La solución real es recordar que JSON es un subconjunto de sintaxis literal de JavaScript:

var obj = <?=$data?>;


El problema al que te enfrentas es que estás presentando los resultados de la llamada json_encode a javascript como una cadena, mientras que es un javascript válido. Elimine el conjunto jQuery.jsonParse de la salida y simplemente asigne los resultados repetidos a la variable javascript en cuestión.

var obj = <?= json_encode(array("casts"=>array("Matthew Modine","Adam Baldwin","Vincent D''Onofrio"),"year"=>1987)); ?>;


Esto debería ser sencillo si el problema se trata solo de comillas simples:

str_replace("''", "/'", json_encode($array));


Para el problema más amplio de pasar una cadena codificada en JSON en PHP (por ejemplo, a través de cURL), usar la opción JSON_HEX_APOS es la forma más limpia de resolver este problema. Esto resolvería su problema también, aunque las respuestas anteriores son correctas, no necesita llamar a parseJSON, y el objeto de JavaScript es el mismo sin llamar a parseJSON en $data .

Para su código, solo haría este cambio:

json_encode($var) a json_encode($var, JSON_HEX_APOS) .

Aquí hay un ejemplo de los datos codificados correctamente analizados por jQuery: http://jsfiddle.net/SuttX/

Para leer más, aquí hay un ejemplo de la entrada del manual json_encode de PHP.net Ejemplo # 2:

$a = array(''<foo>'',"''bar''",''"baz"'',''&blong&'', "/xc3/xa9"); echo "Apos: ", json_encode($a, JSON_HEX_APOS), "/n";

Esto dará como resultado:

Apos: ["<foo>","/u0027bar/u0027","/"baz/"","&blong&","/u00e9"]

Una lista completa de constantes JSON se puede encontrar aquí: PHP.net constantes JSON


echa un vistazo es realmente me ayuda

$products_arr=array(); $products_arr["category"]=array(); while ($row = $cats->fetch(PDO::FETCH_ASSOC)){ $product_item=array( "id" => $row[''id''], "title" => json_encode($row[''title''])// these will help you ); array_push($products_arr["category"], $product_item); } echo json_encode($products_arr);