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);