Necesito un método muy, muy rápido para verificar si una cadena es JSON o no. Siento que esta no es la mejor manera:
function isJson($string) {
return ((is_string($string) &&
(is_object(json_decode($string)) ||
is_array(json_decode($string))))) ? true : false;
}
¿Algún entusiasta del rendimiento quiere mejorar este método?
php
json
error-handling
json-deserialization
jsonresult
Kirk Ouimet
fuente
fuente
json_decode
una vez ... también, verifique los valores de entrada y retorno dejson_decode
.Respuestas:
fuente
{
,[
o el primer símbolo de cualquier otro literal, puede acelerar enormemente este cuando se espera que muchas de las cadenas entrantes no sean JSON.6.5 = true, '300' = true, 9 = true
etc. Por lo tanto, este podría ser un valor JSON válido, pero la función podría no comportarse como espera, si desea verificar solo las cadenas JSON válidas con{}
o[]
;La función
json_last_error
devuelve el último error ocurrido durante la codificación y decodificación JSON. Entonces, la forma más rápida de verificar el JSON válido esTenga en cuenta que solo
json_last_error
es compatible con PHP> = 5.3.0.Siempre es bueno saber el error exacto durante el tiempo de desarrollo. Aquí hay un programa completo para verificar el error exacto basado en documentos PHP.
Como
json_last_error
no es compatible con PHP 5.2, puede verificar si la codificación o decodificación devuelve un valor booleanoFALSE
. Aquí hay un ejemploEspero que esto sea útil. ¡Feliz codificación!
fuente
((strlen($json) === 5) && ($json !== 'false'))
que también se debe realizar una comprobación para evitar esa ventaja?json_last_error
regresaJSON_ERROR_NONE
.Todo lo que realmente necesitas hacer es esto ...
Esta solicitud ni siquiera requiere una función separada. Simplemente envuelva is_object alrededor de json_decode y continúe. Parece que esta solución hace que la gente piense demasiado en ella.
fuente
is_array
ademásis_object
, de lo contrariois_object
, devolverá falso para las matrices simples codificadas como JSON. Entonces @ggutenberg tiene razón en este caso. Pasar el argumento verdadero ajson_decode
obliga a un objeto a ser devuelto como una matriz. En teoría, siempre podría forzar la decodificación a una matriz y simplemente verificaris_array
, eso debería funcionar.json_encode($array)
una matriz PHP simple, y luegojson_decode($str)
recibo un objeto, pero no una matriz.json_decode($str, true)
obliga a convertir en matriz. ¿Por qué hacer una cadena complicada en su código? Verifiqueis_array(json_decode($str, true))
y, algún tiempo después, cuando lo lea, comprenderá que la decodificación debe ser solo una matriz. Mucho más difícil de adivinaris_object(json_decode($MyJSONArray))
"Oh, ¿estoy comprobando si la decodificación es una matriz o no?"json_decode
devolución de una matriz para evitar que compruebe el objeto y la matriz, pero si no lo hace Y ustedjson_decode
qué Era una matriz simple para empezar, recibirá una matriz a cambio de la decodificación, no un objeto. Debe usarloJSON_FORCE_OBJECT
si desea forzar siempre que un objeto en la codificación IF pase una matriz simple.This request does not require a separate function even
. Estrictamente hablando, ninguna solución requiere una función separada. El objetivo de una función no es hacer que varias líneas de código se vean como una sola línea de código. El objetivo de la función es hacer que el proceso de verificación JSON sea estándar en todas partes en su aplicación, de modo que los diferentes programadores (o el mismo programador a lo largo del tiempo) no utilicen diferentes procedimientos de verificación en diferentes etapas del flujo del programa.Usar
json_decode
para "sondear" podría no ser la forma más rápida. Si se trata de una estructura profundamente anidada, crear instancias de muchos objetos de matrices para tirarlas es una pérdida de memoria y tiempo.Por lo tanto, podría ser más rápido de usar
preg_match
y la expresión regular RFC4627 para garantizar también la validez :Lo mismo en PHP:
Sin embargo, no hay suficiente entusiasta del rendimiento para molestarse con los puntos de referencia aquí.
fuente
json_decode
siempre es más rápido que una expresión regular PCRE. (Aunque no está muy optimizado, no se encontraron pruebas sintéticas, y podrían comportarse de manera diferente en Perl ..)\r
\n
\t
solo tiene sentido para que PHP no los interpole, sino que permita que PCRE los interprete (solo era necesario para el/x
modo). Las otras ocurrencias no lo necesitan estrictamente; sin embargo, "la barra invertida se escapa" en todos los contextos de cadenas de PHP. Entonces uno podría considerarlo más exacto.Esto devolverá verdadero si su cadena representa una matriz u objeto json :
Rechaza cadenas json que solo contienen un número, cadena o booleano, aunque esas cadenas son json técnicamente válidas.
Es el camino más corto que se me ocurre.
fuente
var_dump(isJson('[]')); // bool(false)
. Según la documentación sobre booleanos, esto se debe a que PHP evalúa las matrices con cero elementos como falsas. Aquí hay una enmienda menor para ajustar la declaración de devolución; realiza una comparación idéntica en la salida decodificada que maneja este caso:return $json !== false && $str != $json;
isJson('hello')
como verdadera, lo que no es válido json. La comparación suelta se elige a propósito aquí. No tengo una solución rápida para la situación de matriz / objeto vacía, excepto una feareturn $json == '[]' || ...
La forma más simple y rápida que uso es la siguiente;
Es porque json_decode () devuelve NULL si la cadena ingresada no es json o json no válida.
Función simple para validar JSON
Si tiene que validar su JSON en varios lugares, siempre puede usar la siguiente función.
En la función anterior, obtendrá true a cambio si es un JSON válido.
fuente
json_decode('null') == NULL
ynull
es un valor JSON válido.JSON.parse('null')
en su consola de desarrollo.El valor de retorno http://tr.php.net/manual/en/function.json-decode.php es nulo cuando se detecta una codificación no válida.
fuente
json_decode($str)!=null;
o de lo contrario, la función debería llamarseis_not_json
.json_decode('null')
es JSON válido de acuerdo con la especificación y debe devolver el valor denull
.is_json('false')
yis_json('[]')
regresaráfalse
ya que el tipo no está marcado. Creo que este método debería regresar$str === null || json_decode($str) !== null
.Debe validar su entrada para asegurarse de que la cadena que pasa no esté vacía y que, de hecho, sea una cadena. Una cadena vacía no es JSON válida.
Creo que en PHP es más importante determinar si el objeto JSON incluso tiene datos, porque para usar los datos tendrá que llamar
json_encode()
ojson_decode()
. Sugiero negar objetos JSON vacíos para que no esté ejecutando codificaciones y decodificaciones innecesariamente en datos vacíos.fuente
'0'
no es válido json ... ¿por qué sería cauteloso? @KzqaiEsto lo hará:
Como se muestra en otras respuestas,
json_last_error()
devuelve cualquier error de nuestro último json_decode (). Sin embargo, hay algunos casos de uso en los que esta función por sí sola no es lo suficientemente completa. Por ejemplo, si usted esjson_decode()
un número entero (por ejemplo:)123
, o una cadena de números sin espacios u otros caracteres (por ejemplo:)"123"
, lajson_last_error()
función no detectará un error.Para combatir esto, agregué un paso adicional que garantiza que el resultado de nuestro
json_decode()
sea un objeto o una matriz. Si no es así, volvemosfalse
.Para ver esto en acción, consulte estos dos ejemplos:
json_last_error()
fuente
"hello"
es un JSON válido, y no es un objeto ni una matriz,json_last_error()
es suficientejson_last_error()
devuelve el código de error4
cuandojson_decode()
la cadena"hello"
. Ejemplo aquí: 3v4l.org/lSsEohello
no es un JSON válido, pero"hello"
es 3v4l.org/OEJrQEl método fácil es verificar el resultado de json.
fuente
en GuzzleHttp :
fuente
Anteriormente solo estaba buscando un valor nulo, que en realidad estaba mal.
El código anterior funciona bien con cadenas. Sin embargo, tan pronto como proporciono un número, se rompe, por ejemplo.
Para solucionarlo, lo que hice fue muy simple.
fuente
fuente
Otra forma simple
fuente
json_decode($str,true)
hace que convierta los objetos en matrices para que pase la verificación is_array. Sin embargo, corrige sobre cadenas, enteros, etc.Necesitamos verificar si la cadena pasada no es numérica porque en este caso json_decode no genera ningún error.
fuente
Encontré esta pregunta después de encontrar algo similar en mi trabajo, ayer. Mi solución al final fue un híbrido de algunos de los enfoques anteriores:
fuente
He probado algunas de esas soluciones, pero nada funcionaba para mí. Intento esto simple:
Creo que es una buena solución ya que la decodificación JSON sin el segundo parámetro da un objeto.
EDITAR: si sabe cuál será la entrada, puede adaptar este código a sus necesidades. En mi caso, sé que tengo un Json que comienza por "{", así que no necesito verificar si es una matriz.
fuente
Usando PHPBench con la siguiente clase, se lograron los siguientes resultados:
Conclusión: la forma más rápida de verificar si json es válido es regresar
json_decode($json, true) !== null)
.fuente
No sé sobre el rendimiento o la elegancia de mi solución, pero es lo que estoy usando:
Dado que todas mis cadenas codificadas con JSON comienzan con {"es suficiente probar esto con un RegEx. No tengo fluidez en absoluto con RegEx, por lo que podría haber una mejor manera de hacerlo. Además: strpos () podría ser más rápido.
Solo trato de ceder mi valor de tuppence.
PD: acabo de actualizar la cadena RegEx
/^[\[\{]\"/
para también encontrar cadenas de matriz JSON. Por lo tanto, ahora busca ["o {" al comienzo de la cadena.fuente
Debería ser algo como esto:
Prueba de unidad
fuente
ErrorException
si la cadena es una matriz o un objeto.Ampliando esta respuesta ¿Qué tal lo siguiente:
fuente
Hola, aquí hay un pequeño fragmento de mi biblioteca, en esta primera condición solo estoy verificando si los datos son json y luego los devuelvo si están decodificados correctamente, tenga en cuenta el uso de substr para el rendimiento (aún no he visto ningún archivo json que no comience ni por {o [
fuente
Otra sugerencia mía :)
fuente
La función personalizada
Casos
Recursos
https://gist.github.com/rafasashi/93d06bae83cc1a1f440b
fuente
Función recién hecha para compatibilidad con PHP 5.2, si necesita los datos decodificados en caso de éxito:
Uso:
Algunas pruebas:
fuente
fuente
Una modificación simple a la respuesta de henrik para tocar las posibilidades más requeridas.
(incluidos "{} y []")
fuente
La manera más rápida de tal decodificar un posible objeto JSON a un objeto PHP / matriz:
fuente
Aquí hay una función simple y de alto rendimiento que creé (que usa la validación básica de cadenas antes de usar
json_decode
para cadenas más grandes):fuente