2009-07-27 17 views
36

¿Alguien sabe de un robusto (ya prueba de balas) fragmento de función is_JSON para PHP? Yo (obviamente) tengo una situación en la que necesito saber si una cadena es JSON o no.¿Cómo determinar si una cadena es válida JSON?

Hmm, tal vez ejecutarlo a través de una solicitud/respuesta JSONLint, pero eso parece un poco exagerado.

+1

Disparar; Tenía una solución a prueba de balas a mano, pero no era muy robusta, así que tuve que descartarla: P –

Respuesta

60

Si está utilizando el construido en función de PHP json_decode, json_last_error devuelve el último error (por ejemplo JSON_ERROR_SYNTAX cuando su cadena no era JSON).

Generalmente json_decode devuelve null de todos modos.

+3

Sí, soy un idiota. Esto fue obvio y me lo perdí. Puedo resumir esto en lo que necesito. Gracias. – Spot

+0

Solución sólida en la mayoría de los casos, pero tenga cuidado. json_decode también puede analizar, p. cadenas numéricas. Un número de teléfono en una cadena se convertiría a un número entero. Sin embargo, esto no ocurre en todos los servidores. En mi máquina de Windows obtengo números enteros, en el sistema de desarrollo de Linux me estoy volviendo falso. Supongo que depende de su instalación y configuración PHP – StoryTeller

+0

Como se menciona StoryTeller - json_decode ("51232") se evalúa como 51232, por lo que puede no ser útil en todas las situaciones –

17

¿Qué hay de usar json_decode, que debería devolver null si la cadena dada no era válida Datos codificados en JSON?

Véase el ejemplo 3 en la página del manual:

// the following strings are valid JavaScript but not valid JSON 

// the name and value must be enclosed in double quotes 
// single quotes are not valid 
$bad_json = "{ 'bar': 'baz' }"; 
json_decode($bad_json); // null 

// the name must be enclosed in double quotes 
$bad_json = '{ bar: "baz" }'; 
json_decode($bad_json); // null 

// trailing commas are not allowed 
$bad_json = '{ bar: "baz", }'; 
json_decode($bad_json); // null 
4

¿No es json_decode() con un json_last_error() que funcione para usted? ¿Está buscando solo un método para decir "¿se ve esto como JSON" o realmente validarlo? json_decode() sería la única forma de validarlo efectivamente en PHP.

3
 
$this->post_data = json_decode(stripslashes($post_data)); 
    if($this->post_data === NULL) 
    { 
    die('{"status":false,"msg":"The post_data parameter must be valid JSON"}'); 
    } 
13

Para mis proyectos que utilizo esta función (consulte la sección "Nota " en los documentos json_decode()).

Pasando los mismos argumentos que pasaría a json_decode() se puede detectar "errores" específicos de la aplicación (por ejemplo, errores de profundidad)

Con PHP> = 5,6

// PHP >= 5.6 
function is_JSON(...$args) { 
    json_decode(...$args); 
    return (json_last_error()===JSON_ERROR_NONE); 
} 

Con PHP> = 5,3

// PHP >= 5.3 
function is_JSON() { 
    call_user_func_array('json_decode',func_get_args()); 
    return (json_last_error()===JSON_ERROR_NONE); 
} 

ejemplo de uso:

$mystring = '{"param":"value"}'; 
if (is_JSON($mystring)) { 
    echo "Valid JSON string"; 
} else { 
    $error = json_last_error_msg(); 
    echo "Not valid JSON string ($error)"; 
} 
+0

No soy un experto en PHP, pero esta solución no parece muy eficiente, como cuando se requiere la decodificación JSON, lo hace dos veces: una vez cuando se prueba si la cadena es JSON válida, y la segunda vez cuando se está decodificando realmente. Parece que sería más inteligente simplemente tener esta función, solo verificar el último error JSON, suponiendo que json_decode ya se haya ejecutado. Doy la bienvenida a otras opiniones. –

+0

Hola @LiranH, el póster original solicitó una función 'is_JSON', por lo tanto, no puedo asumir dentro de la función que json_decode se acaba de ejecutar en la cadena solicitada. En ese caso, su función se llamaría 'is_last_json_decoded_string_a_JSON_string'. – cgaldiolo

+0

Eso es justo @cgaldiolo –

Cuestiones relacionadas