¿Cómo puedo verificar si un valor es un objeto json?
101
El código del lado del servidor devuelve un valor que es un objeto json en caso de éxito y una cadena 'falso' en caso de error. Ahora, ¿cómo puedo verificar si el valor devuelto es un objeto json?
Si en realidad es "su" código del lado del servidor, ¿por qué no tener un campo de estado en el resultado JSON en lugar de crear esta situación de "a veces-es-JSON-y-a veces-no-lo-es" ...?
HostileFork dice que no confíes en SE
@Hostile Por motivos de depuración. Nunca se sabe qué tipo de falla arrojará el servidor y en ese momento no se está utilizando json.
bart
1
Todavía no veo cómo tener un código de error (como un campo con nombre) en la respuesta del servidor socavaría eso. ¡Es lo suficientemente bueno para Freebase! wiki.freebase.com/wiki/MQL_errors
HostileFork dice que no confíes en SE
Cambie la respuesta aceptada por la de Serguei Federov, si puede, la respuesta aceptada actualmente es incorrecta.
Serj Sagan
¿Qué es un "objeto json"? Hay cadenas JSON y objetos JS, pero no existe un "objeto de notación de objetos JavaScript".
mpen
Respuestas:
105
jQuery.parseJSON () debería devolver un objeto de tipo "objeto", si la cadena era JSON, por lo que solo tienes que comprobar el tipo con typeof
var response=jQuery.parseJSON('response from server');if(typeof response =='object'){// It is JSON}else{if(response ===false){// the response was a string "false", parseJSON will convert it to boolean false}else{// the response was something else}}
También es posible que deba usar un try / catch para las excepciones si es posible que parseJSON esté tratando con algo diferente a los valores JSON (es decir, HTML)
acorncom
2
Antes de jQuery 1.9, $ .parseJSON devolvía nulo en lugar de arrojar un error si se pasaba una cadena vacía, nula o indefinida, aunque esos no son JSON válidos. Enlace del sitio jquery
gloomy.penguin
7
Esta solución no es la mejor, ¡porque devuelve "SyntaxError: JSON.parse: unexpected character"error! , Creo que la mejor solución es usar try / catch que dice Serguei Fedorovaquí: stackoverflow.com/questions/4295386/…
error en Chrome. Esto se debe a que el error se produce tan pronto como el análisis se encuentra con un carácter desconocido. Sin embargo, hay una forma de evitar esto si solo devuelve valores de cadena a través de ajax (que puede ser bastante útil si está utilizando PHP o ASPX para procesar solicitudes de ajax y podría o no devolver JSON según las condiciones)
La solución es bastante simple, puede hacer lo siguiente para verificar si fue una devolución JSON válida
var IS_JSON =true;try{var json = $.parseJSON(msg);}catch(err){
IS_JSON =false;}
Como he dicho antes, esta es la solución si está devolviendo material de tipo cadena de su solicitud AJAX o si está devolviendo un tipo mixto.
La pregunta no se trata de cadenas que no sean JSON en ningún momento. El servidor siempre devuelve un JSON válido (una cadena falsetambién es JSON válido). La pregunta trata solo sobre un punto: cómo diferenciar si la cadena JSON analizada es un booleano falseo un objeto
Dr. Molle
2
Consideración de rendimiento: al envolver esto en una función, asegúrese de no analizar el json dos veces (una vez dentro de la captura de prueba y otra en el código que llama a la función).
Michiel Cornille
Es un ayudantes funcionan isJSON () que puede utilizar: isJSON(someValue).
Si usa JQuery para traer información a través de AJAX. Te recomiendo que pongas en el atributo "dataType" el valor "json", de esa forma si obtienes un JSON o no, JQuery lo valida por ti y lo da a conocer a través de sus funciones "éxito" y "error". Ejemplo:
$.ajax({
url:'http://www.something.com',
data: $('#formId').serialize(),
method:'POST',
dataType:'json',// "sucess" will be executed only if the response status is 200 and get a JSON
success:function(json){},// "error" will run but receive state 200, but if you miss the JSON syntax
error:function(xhr){}});
Si usa isPlainObject en una cadena, devuelve falso, por ejemplo, jQuery.isPlainObject ('{}')
Roy Shoa
Más importante aún, si contiene un valor no similar a JSON como propiedad, de acuerdo con los documentos, esta función seguirá regresando true.
samvv
6
var checkJSON =function(m){if(typeof m =='object'){try{ m = JSON.stringify(m);}catch(err){returnfalse;}}if(typeof m =='string'){try{ m = JSON.parse(m);}catch(err){returnfalse;}}if(typeof m !='object'){returnfalse;}returntrue;};
checkJSON(JSON.parse('{}'));//true
checkJSON(JSON.parse('{"a":0}'));//true
checkJSON('{}');//true
checkJSON('{"a":0}');//true
checkJSON('x');//false
checkJSON('');//false
checkJSON();//false
Sé que este hilo ya ha sido respondido, pero venir aquí realmente no resolvió mis problemas, encontré esta función en otro lugar. tal vez alguien que venga aquí lo encontrará de alguna utilidad;
function getClass(obj){if(typeof obj ==="undefined")return"undefined";if(obj ===null)return"null";returnObject.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1];}
Si desea probar explícitamente JSON válido (a diferencia de la ausencia del valor devuelto false), puede usar un enfoque de análisis como se describe aquí .
Realmente no me gusta la respuesta aceptada. En primer lugar, requiere jQuery, que no siempre está disponible o es obligatorio. En segundo lugar, hace una cadena completa del objeto que para mí es excesivo. Aquí hay una función simple que detecta a fondo si un valor es similar a JSON, usando nada más que algunas partes de la biblioteca lodash para genérico.
Respuestas:
jQuery.parseJSON () debería devolver un objeto de tipo "objeto", si la cadena era JSON, por lo que solo tienes que comprobar el tipo con
typeof
fuente
"SyntaxError: JSON.parse: unexpected character"
error! , Creo que la mejor solución es usar try / catch que diceSerguei Fedorov
aquí: stackoverflow.com/questions/4295386/…La solución elegida no me funciona realmente porque obtengo una
error en Chrome. Esto se debe a que el error se produce tan pronto como el análisis se encuentra con un carácter desconocido. Sin embargo, hay una forma de evitar esto si solo devuelve valores de cadena a través de ajax (que puede ser bastante útil si está utilizando PHP o ASPX para procesar solicitudes de ajax y podría o no devolver JSON según las condiciones)
La solución es bastante simple, puede hacer lo siguiente para verificar si fue una devolución JSON válida
Como he dicho antes, esta es la solución si está devolviendo material de tipo cadena de su solicitud AJAX o si está devolviendo un tipo mixto.
fuente
false
también es JSON válido). La pregunta trata solo sobre un punto: cómo diferenciar si la cadena JSON analizada es un booleanofalse
o un objetoisJSON(someValue)
.Solución 3 (forma más rápida)
Puedes usarlo:
La mejor forma de validar que un objeto es de tipo JSON o matriz es la siguiente:
Solución 1
Solucion 2
Pero, estrictamente hablando, una matriz es parte de una sintaxis JSON. Por lo tanto, los dos ejemplos siguientes son parte de una respuesta JSON:
Y:
AJAX / JQuery (recomendado)
Si usa JQuery para traer información a través de AJAX. Te recomiendo que pongas en el atributo "dataType" el valor "json", de esa forma si obtienes un JSON o no, JQuery lo valida por ti y lo da a conocer a través de sus funciones "éxito" y "error". Ejemplo:
fuente
Si tiene jQuery, use isPlainObject .
fuente
true
.fuente
Dado que es solo un objeto falso y json, ¿por qué no verifica si es falso? De lo contrario, debe ser json.
fuente
Sé que este hilo ya ha sido respondido, pero venir aquí realmente no resolvió mis problemas, encontré esta función en otro lugar. tal vez alguien que venga aquí lo encontrará de alguna utilidad;
fuente
fuente
Si desea probar explícitamente JSON válido (a diferencia de la ausencia del valor devuelto
false
), puede usar un enfoque de análisis como se describe aquí .fuente
Realmente no me gusta la respuesta aceptada. En primer lugar, requiere jQuery, que no siempre está disponible o es obligatorio. En segundo lugar, hace una cadena completa del objeto que para mí es excesivo. Aquí hay una función simple que detecta a fondo si un valor es similar a JSON, usando nada más que algunas partes de la biblioteca lodash para genérico.
Incluso me he tomado el tiempo de ponerlo en npm como paquete: https://npmjs.com/package/is-json-object . Úselo junto con algo como Webpack para obtenerlo en el navegador.
¡Espero que esto ayude a alguien!
fuente
Estoy usando esto para validar el objeto JSON
Estoy usando esto para validar JSON String
fuente
Probé todas las respuestas sugeridas, nada funcionó para mí, así que tuve que usar
azada que ayuda a alguien más con este problema
fuente
Debe devolver json siempre , pero cambie su estado , o en el siguiente ejemplo, la propiedad ResponseCode :
fuente