Tengo una simple llamada AJAX, y el servidor devolverá una cadena JSON con datos útiles o una cadena de mensaje de error producida por la función PHP mysql_error()
. ¿Cómo puedo probar si estos datos son una cadena JSON o el mensaje de error?
Sería bueno usar una función llamada isJSON
al igual que puede usar la función instanceof
para probar si algo es una matriz.
Esto es lo que quiero:
if (isJSON(data)){
//do some data stuff
}else{
//report the error
alert(data);
}
javascript
mysql
json
jeffery_the_wind
fuente
fuente
eval()
si vuelveundefined
, entonces no es JSONRespuestas:
Utilice JSON.parse
fuente
JSON.parse(1234)
O OJSON.parse(0)
OJSON.parse(false)
OJSON.parse(null)
todo no aumentará la Excepción y volverá verdadero !!. no use esta respuesta1234
,0
,false
, ynull
son válidos todos los valores JSON. Si desea un predicado que pruebe si el JSON representa un objeto, deberá hacer un poco más.JSON.parse
hace muchos cálculos para analizar la cadena y le da el objeto json si tiene éxito, sin embargo, está descartando el resultado que algunos usuarios podrían querer usar. Eso no parece ser bueno. En cambio,return {value: JSON.parse(str), valid: true};
y en el bloque catchreturn {value: str, valid: false};
... y cambiaría el nombre de la función atryParse()
.Este código es
JSON.parse(1234)
oJSON.parse(0)
oJSON.parse(false)
oJSON.parse(null)
todo volverá realidad.Entonces reescribí el código de esta manera:
Resultado de la prueba:
Resultado de la prueba isJson
fuente
return (typeof suspect === "object" && suspect !== null);
Recapitulemos esto (para 2019+).
HECHO : Estos valores primitivos son JSON-parsable pero no son estructuras JSON bien formadas . La especificación JSON indica que JSON se basa en dos estructuras: una colección de pares de nombre / valor (objeto) o una lista ordenada de valores (matriz).
HECHO : ¡No! Definitivamente es legal usar try / catch, especialmente en un caso como este. De lo contrario, necesitaría hacer muchas cosas de análisis de cadenas como las operaciones de tokenizing / regex; lo que tendría un desempeño terrible.
hasJsonStructure()
Esto es útil si su objetivo es verificar si algunos datos / texto tienen el formato de intercambio JSON adecuado.
Uso:
safeJsonParse()
Y esto es útil si desea tener cuidado al analizar algunos datos a un valor de JavaScript.
Uso:
fuente
Si el servidor responde con JSON, entonces tendría un
application/json
tipo de contenido; si responde con un mensaje de texto sin formato, debería tener untext/plain
tipo de contenido. Asegúrese de que el servidor responde con el tipo de contenido correcto y pruébelo.fuente
overrideMimeType
puede anular el encabezado de tipo de contenido.cuando se utiliza
jQuery $.ajax()
la respuesta tendrá laresponseJSON
propiedad si la respuesta fue JSON, esto podría verificarse así:fuente
Me gusta la mejor respuesta, pero si es una cadena vacía, devuelve verdadero. Así que aquí hay una solución:
fuente
Sin embargo, le sugeriré que su llamada / servicio http debe devolver siempre datos en el mismo formato. Entonces, si tiene un error, debe tener un objeto JSON que envuelva este error:
Y tal vez use, además del estado HTTP, un código 5xx.
fuente
Bueno ... Depende de la forma en que recibe sus datos. Creo que el servidor está respondiendo con una cadena con formato JSON (usando json_encode () en PHP, por ejemplo). Si está utilizando la publicación JQuery y establece que los datos de respuesta sean un formato JSON y es un JSON con formato incorrecto, esto producirá un error:
Pero, si está usando la respuesta de tipo como texto, necesita usar $ .parseJSON. Según el sitio jquery: "Pasar una cadena JSON con formato incorrecto puede generar una excepción". Así su código será:
fuente
response
está vacía, irá asuccess
: '(Probablemente hay pruebas que puede hacer, por ejemplo, si sabe que el JSON devuelto siempre estará rodeado
{
y}
luego podría probar esos caracteres o algún otro método hacky. O puede usar la biblioteca json.org JS para intentar analizarla y comprobar si tiene éxito.Sin embargo, sugeriría un enfoque diferente. Su script PHP actualmente devuelve JSON si la llamada es exitosa, pero algo más si no lo es. ¿Por qué no siempre devolver JSON?
P.ej
Llamada exitosa:
Llamada errónea:
Esto facilitaría mucho más la escritura de su JS del lado del cliente: todo lo que tiene que hacer es verificar el miembro de "estado" y actuar en consecuencia.
fuente
Solo uso 2 líneas para realizar eso:
¡Eso es todo!
Pero tenga en cuenta que hay 2 trampas:
1.
JSON.parse(null)
devuelvenull
2. Cualquier número o cadena se puede analizar con el
JSON.parse()
método.JSON.parse("5")
devuelve5
JSON.parse(5)
devuelve5
Juguemos un poco sobre el código:
fuente
[
y]
. Por ejemplo,[1, 2, 3]
es una matriz de números.["a", "b", "c"]
es una matriz de cadenas. Y[{"a":1}, {"b":2}]
es una matriz JSON. ¡Tu trabajo jsfiddle parece realmente útil!JSON.parse
. ¿Alguien puede aconsejar cómo evitar ese error sin usar try?jsfiddle
aplicación arroja un error debido a que la Prueba 3 no tiene una expresión JSON válida. Por lo tanto,try-catch
debe usarse para detectar ese error y evaluar cualquier error, ya que la expresión no es JSON cuando se analiza como en la Prueba 3 anterior:try { JSON.parse(data3) } catch(e) { isValidJSON = false }
Puede intentar decodificarlo y detectar la excepción (nativa o json2.js ):
Sin embargo, sugeriría que la respuesta siempre sea válida JSON. Si recibe un error de su consulta MySQL, simplemente envíe JSON con el error:
Y entonces:
fuente
Advertencia: para los métodos en los que se confía
JSON.parse
: las matrices y las cadenas entre comillas también pasarán (es decirconsole.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
) .Para evitar todas las primitivas JSON que no sean objetos (booleano, nulo, matriz, número, cadena), sugiero usar lo siguiente:
Explicación del código
¿Por qué no usar la respuesta hasJsonStructure ()?
Confiar en
toString()
no es una buena idea. Esto se debe a que diferentes motores de JavaScript pueden devolver una representación de cadena diferente. En general, los métodos que dependen de esto pueden fallar en diferentes entornos o pueden estar sujetos a fallar más tarde si el motor cambia el resultado de la cadena¿Por qué atrapar una excepción no es un truco?
Se mencionó que atrapar una excepción para determinar la validez de algo nunca es el camino correcto. Este es generalmente un buen consejo, pero no siempre. En este caso, es probable que la captura de excepciones sea la mejor ruta porque se basa en la implementación del motor JavaScript para validar los datos JSON.
Confiar en el motor JS ofrece las siguientes ventajas:
Cuando tenga la oportunidad de apoyarse en el motor de JavaScript, sugeriría hacerlo. Particularmente en este caso. Aunque puede parecer extraño detectar una excepción, en realidad solo está manejando dos posibles estados de retorno de un método externo.
fuente
Aquí hay un código con algunas modificaciones menores en la respuesta de Bourne. Como JSON.parse (número) funciona bien sin ninguna excepción, se agrega isNaN.
fuente
Todas las cadenas json comienzan con '{' o '[' y terminan con el correspondiente '}' o ']', así que verifíquelo.
Así es como lo hace Angular.js:
https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js
fuente
{ someValue }
pasará automáticamente la validación.Sugiero en modo mecanografiado:
fuente
Usé esta (una especie de combinación de diferentes respuestas, pero de todos modos):
fuente
Puede probar el siguiente porque también valida número, nulo, cadena, pero la respuesta marcada anteriormente no funciona correctamente, es solo una solución de la función anterior:
fuente
Además de las respuestas anteriores, en caso de que necesite validar un formato JSON como "{}", puede usar el siguiente código:
Ejemplos de uso: