utf8 recorrer json_unescaped_unicode json_encode ejemplo php json

recorrer - El json_encode de PHP no escapa a todos los caracteres de control JSON



recorrer json php (13)

$ val = array ("/ n", "/ r");

$ string = str_replace ($ val, "", $ string);

Eliminará toda la línea nueva de la cadena json en php

¿Hay alguna razón por la cual la función json_encode de PHP no escapa a todos los caracteres de control JSON en una cadena?

Por ejemplo, tomemos una cadena que abarca dos filas y tiene caracteres de control (/ r / n "/ /) en ella:

<?php $s = <<<END First row. Second row w/ "double quotes" and backslash: /. END; $s = json_encode($s); echo $s; // Will output: "First row./r/nSecond row w// /"double quotes/" and backslash: //." ?>

Tenga en cuenta que los caracteres de retorno de carro y de línea nueva no están guardados. ¿Por qué?

Estoy usando jQuery como mi biblioteca JS y su función $ .getJSON () funcionará correctamente cuando confíes por completo el 100% de los datos entrantes. De lo contrario, utilizo la biblioteca json2.js de JSON.org como todos los demás. Pero si intentas analizar esa cadena codificada, arroja un error:

<script type="text/javascript"> JSON.parse(<?php echo $s ?>); // Will throw SyntaxError </script>

¡Y no puedes obtener los datos! Si elimina o escapa / r / n "y / en esa cadena, entonces JSON.parse () no lanzará el error.

¿Existe alguna función PHP buena para escaparse de los caracteres de control? Simple str_replace con buscar y reemplazar matrices no funcionará.


Esto es lo que uso personalmente y nunca funcionó. Tuve problemas similares originalmente.

El script de origen (ajax) tomará un conjunto y json_encode it. Ejemplo:

$return[''value''] = ''test''; $return[''value2''] = ''derp''; echo json_encode($return);

Mi javascript hará una llamada AJAX y obtendrá el eco de "json_encode ($ return)" como entrada, y en el script usaré lo siguiente:

myVar = jQuery.parseJSON(msg.replace(/&quot;/ig,''"''));

con "msg" siendo el valor devuelto. Entonces, para ti, algo así como ...

var msg = ''<?php echo $s ?>''; myVar = jQuery.parseJSON(msg.replace(/&quot;/ig,''"''));

... podría funcionar para ti.


D''oh - necesitas codificar doblemente: JSON.parse espera una cadena de curso:

<script type="text/javascript"> JSON.parse(<?php echo json_encode($s) ?>); </script>


Tal vez estoy ciego, pero en tu ejemplo ellos escaparon. Qué pasa

<script type="text/javascript"> JSON.parse("<?php echo $s ?>"); // Will throw SyntaxError </script>

(tenga en cuenta diferentes citas)


$search = array("/n", "/r", "/u", "/t", "/f", "/b", "/", ''"''); $replace = array("//n", "//r", "//u", "//t", "//f", "//b", "//", "/""); $encoded_string = str_replace($search, $replace, $json);

Esta es la forma correcta


Todavía no he resuelto ninguna solución sin str_replace ..

Prueba este código

$json_encoded_string = json_encode(...); $json_encoded_string = str_replace("/r", ''/r'', $json_encoded_string); $json_encoded_string = str_replace("/n", ''/n'', $json_encoded_string);

Espero que ayude...


function escapeJsonString($value) { # list from www.json.org: (/b backspace, /f formfeed) $escapers = array("//", "/", "/"", "/n", "/r", "/t", "/x08", "/x0c"); $replacements = array("////", "///", "///"", "//n", "//r", "//t", "//f", "//b"); $result = str_replace($escapers, $replacements, $value); return $result; }

Estoy usando la función anterior, que escapa de una barra diagonal inversa (debe ser la primera en las matrices) y debe ocuparse de alimentaciones de página y espacios inversos (no creo que /f /b y /b sean compatibles con PHP).


Cuando se usa cualquier forma de Ajax, parece que en la Web falta documentación detallada sobre el formato de las respuestas recibidas del servidor CGI. Algunas notas aquí y las entradas en .com señalan que las líneas nuevas en el texto devuelto o los datos json deben escaparse para evitar bucles infinitos (bloqueos) en la conversión JSON (posiblemente creados lanzando una excepción no detectada), ya sea que los haga jQuery o manualmente Sistema Javascript o biblioteca de análisis JSON de llamadas.

En cada caso en que los programadores publiquen este problema, se presentan soluciones inadecuadas (la mayoría de las veces reemplazando / n por // n en el lado de envío) y el asunto se descarta. Su inadecuación se revela cuando se pasan valores de cadena que incorporan accidentalmente secuencias de escape de control, como los nombres de las rutas de Windows. Un ejemplo es "C: / Chris / Roberts.php", que contiene los caracteres de control ^ c y ^ r, que pueden causar la conversión JSON de la cadena {"archivo": "C: / Chris / Roberts.php"} a lazo por siempre Una forma de generar dichos valores es deliberadamente intentar pasar mensajes de advertencia y error PHP de servidor a cliente, una idea razonable.

Por definición, Ajax usa conexiones HTTP detrás de escena. Estas conexiones pasan datos usando GET y POST, y ambos requieren codificación de los datos enviados para evitar la sintaxis incorrecta, incluidos los caracteres de control.

Esto proporciona una pista suficiente para construir lo que parece ser una solución (necesita más pruebas): usar rawurlencode en el lado de PHP (envío) para codificar los datos, y unescape en el lado de Javascript (recibir) para decodificar los datos. En algunos casos, los aplicará a cadenas de texto enteras, en otros casos los aplicará solo a valores dentro de JSON.

Si esta idea resulta ser correcta, se pueden construir ejemplos simples para ayudar a los programadores de todos los niveles a resolver este problema de una vez por todas.


Los caracteres de control no tienen un significado especial en HTML a excepción de la nueva línea en textarea.value. JSON_encode en PHP> 5.2 lo hará como usted esperaba.

Si solo quieres mostrar texto, no necesitas ir detrás de JSON. JSON es para matrices y objetos en JavaScript (y matriz indexada y asociativa para PHP).

Si necesita un avance de línea para la etiqueta texarea:

$s=preg_replace(''//r */'','''',$s); echo preg_replace(''/ */n */'',''&#13;'',$s);


No entiendo completamente cómo funciona var_export, así que lo actualizaré si encuentro problemas, pero esto parece funcionar para mí:

<script> window.things = JSON.parse(<?php var_export(json_encode($s)); ?>); </script>


Solo una adición a la respuesta de Greg : la salida de json_encode() ya está contenida en comillas dobles ( " ), por lo que no es necesario rodearlas con comillas nuevamente:

<script type="text/javascript"> JSON.parse(<?php echo $s ?>); </script>


Hay 2 soluciones a menos que se use AJAX:

  1. Escribe datos en entrada como y léelo en JS:

    <input type="hidden" value="<?= htmlencode(json_encode($data)) ?>"/>

  2. Use addslashes

    var json = ''<?= addslashes(json_encode($data)) ?>'';


Convertir PHP y PHP no debería ser un problema. El json_encode de PHP hace una codificación adecuada pero reinterpreta que el script java interno puede causar problemas. Me gusta

1) cadena original - [cadena con nnn nueva línea en ella] (donde nnn es el carácter de línea nueva real)

2) json_encode convertirá esto en [cadena con "nueva línea"]] (carácter de control convertido a "// n" - Literal "/ n"

3) Sin embargo, cuando imprime esto de nuevo en una cadena literal usando php echo, entonces "// n" se interpreta como "/ n" y eso causa dolor de corazón. Debido a que JSON.parse comprenderá una letra impresa literal "/ n" como nueva línea - un carácter de control (nnn)

así que para solucionar esto:

A) Primero codifica el objeto json en php usando json_enocde y obtén una cadena. Luego ejecútelo a través de un filtro que lo haga seguro para ser utilizado dentro de html y script java.

B) utilice la cadena JSON que viene de PHP como un "literal" y póngalo entre comillas simples en lugar de comillas dobles.

<?php function form_safe_json($json) { $json = empty($json) ? ''[]'' : $json ; $search = array(''//',"/n","/r","/f","/t","/b","''") ; $replace = array(''////',"//n", "//r","//f","//t","//b", "&#039"); $json = str_replace($search,$replace,$json); return $json; } $title = "Tiger''s /new //found //freedom " ; $description = <<<END Tiger was caged in a Zoo And now he is in jungle with freedom END; $book = new /stdClass ; $book->title = $title ; $book->description = $description ; $strBook = json_encode($book); $strBook = form_safe_json($strBook); ?> <!DOCTYPE html> <html> <head> <title> title</title> <meta charset="utf-8"> <script type="text/javascript" src="/3p/jquery/jquery-1.7.1.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ var strBookObj = ''<?php echo $strBook; ?>'' ; try{ bookObj = JSON.parse(strBookObj) ; console.log(bookObj.title); console.log(bookObj.description); $("#title").html(bookObj.title); $("#description").html(bookObj.description); } catch(ex) { console.log("Error parsing book object json"); } }); </script> </head> <body> <h2> Json parsing test page </h2> <div id="title"> </div> <div id="description"> </div> </body> </html>

Ponga la cadena dentro de comillas simples en el script java. Poner cadena JSON entre comillas dobles haría que el analizador falle en los marcadores de atributos (algo así como {"id": "value"}). No se requiere ningún otro escape si coloca la cadena como "literal" y deja que el analizador JSON haga el trabajo.