Estoy tratando de escribir un script php que maneje datos de un servicio web que entregue "json" como una cadena. El problema es que la cadena no es realmente json; es javascript Específicamente, las claves no se citan, aunque sí las variables. Ejemplo (los datos reales es mucho más largo y más complicado):Manejo de JSON malformado en PHP
{desc:'User defined payload'}
Como se describe por el php manual, json_decode() falla correctamente para interpretar esta cadena.
Mi pregunta es, ¿cómo puedo interpretar con éxito una cadena como esta en php?
La única solución que se me ocurre es escribir algunas expresiones regulares que corrijan la sintaxis, pero entonces tendría dos problemas.
EDITAR
sugerencia de utilizar el módulo Services_JSON pera de Hadvig trabajó, y se ve como una solución general. Una vez que tuve el módulo instalado, mi código se veía así:
require_once 'PEAR.php';
require_once 'Services/JSON.php';
$Services_JSON = new Services_JSON();
$data = $Services_JSON->decode($malformed_json);
Desafortunadamente, esto es LENTO. ¡Interpretar toda la cadena (~ 400,000 caracteres) llevó> 36 segundos! Usar una expresión regular para arreglar las comillas y luego usar json_decode tomó ~ 0.04 segundos. Esto es lo que solía:
// fix single quotes
$s = str_replace("'", '"', $malformed_json);
// fix unquoted keys
$valid_json = preg_replace('/([{\[,])\s*([a-zA-Z0-9_]+?):/', '$1"$2":', $s);
$data = json_decode($valid_json);
Por supuesto, esto se romperá si los datos contienen las comillas, paréntesis o comas.
¿Podría modificar el proceso de creación de la cadena? –
Si conoce la cita de dos problemas, entonces probablemente sepa la cita sobre el uso de expresiones regulares cuando debería usar un analizador;) – Dan
PMV: desafortunadamente, no – Chris