Algo como:
var jsonString = '{ "Id": 1, "Name": "Coke" }';
//should be true
IsJsonString(jsonString);
//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")
La solución no debe contener try / catch. Algunos de nosotros activamos "romper todos los errores" y no les gusta que el depurador rompa esas cadenas JSON no válidas.
javascript
json
Chi Chan
fuente
fuente
try
?Respuestas:
Un comentario primero. La pregunta era sobre no usar
try/catch
.Si no le importa usarlo, lea la respuesta a continuación. Aquí solo verificamos una
JSON
cadena usando una expresión regular, y funcionará en la mayoría de los casos, no en todos los casos.Eche un vistazo a la línea 450 en https://github.com/douglascrockford/JSON-js/blob/master/json2.js
Hay una expresión regular que comprueba un JSON válido, algo así como:
EDITAR : La nueva versión de json2.js hace un análisis más avanzado que el anterior, pero aún se basa en un reemplazo de expresiones regulares (del comentario de @Mrchief )
fuente
Use un analizador JSON como
JSON.parse
:fuente
JSON.parse("false")
evalúa como falso .Sé que llego 3 años tarde a esta pregunta, pero sentí ganas de hablar.
Si bien la solución de Gumbo funciona muy bien, no maneja algunos casos en los que no se plantea ninguna excepción para
JSON.parse({something that isn't JSON})
También prefiero devolver el JSON analizado al mismo tiempo, para que el código de llamada no tenga que llamar
JSON.parse(jsonString)
por segunda vez.Esto parece funcionar bien para mis necesidades:
fuente
o && o !== null
es superfluoundefined
, nofalse
porquefalse
sea una cadena json válida y no haya forma de diferenciar entretryParseJSON("false")
ytryParseJSON("garbage")
Uso:
isJSON({})
seráfalse
,isJSON('{}')
serátrue
.Para verificar si algo es un
Array
oObject
( JSON analizado ):Uso:
isAO({})
serátrue
,isAO('{}')
seráfalse
.fuente
null
pasa esta validación.return !!(JSON.parse(str) && str);
debería bloquear valores nulos. Actualizaré la respuesta con este código.parse()
prueba, causando WTF.Aquí mi código de trabajo:
fuente
typeof str === 'string'
Utilicé un método realmente simple para verificar si una cadena es un JSON válido o no.
Resultado con una cadena JSON válida:
Resultado con una cadena simple;
Resultado con un objeto:
Resultado con entrada nula:
El último devuelve falso porque el tipo de variables nulas es objeto.
Esto funciona todo el tiempo. :)
fuente
null
entrada devuelve falso. Pero la entrada "falsa" es una cadena JSON válida. Esto será analizado aboolean (false)
. Ahora modifico el código para que sea más preciso.En prototypeJS, tenemos el método isJSON . Puedes probar eso. Incluso json podría ayudar.
fuente
"{ foo: 42 }".isJSON()
? Sifalse
, como supongo (el resultado debe seguir a la función del documento), entonces una buena pregunta es, ¿por qué es falso?{ foo: 42 }
parece ser perfectamente válido JSON.De la
String.isJSON
definición del marco prototipo aquíasí que esta es la versión que se puede usar pasando un objeto de cadena
fuente
Usé JQuery para analizar cadenas JSON y usé la declaración trycatch para manejar excepciones, pero lanzar excepciones para cadenas no analizables ralentizó mi código, por lo que usé Regex simple para verificar la cadena si es una posible cadena JSON o no sin pluma comprobando su sintaxis, luego usé la forma regular al analizar la cadena usando JQuery:
fuente
Tal vez sea útil:
salida:
IE7: cadena , objeto, cadena, cadena
CROMO: objeto, objeto, cadena, cadena
fuente
Creo que sé por qué quieres evitar eso. Pero tal vez intente y atrape! == intente y atrape. ; o) Esto vino a mi mente:
Por lo tanto, también puede hacer un clip sucio al objeto JSON, como:
Como esto está tan encapsulado como sea posible, es posible que no se rompa por error.
fuente
Aquí está la versión mecanografiada también:
fuente
fuente
Por el comentario inicial deduzco que el caso de uso está delineando si una respuesta es HTML o JSON. En cuyo caso, cuando lo hagas recibir JSON, probablemente debería ser el análisis y la manipulación de JSON no válida en algún momento de su código de todos modos. Aparte de cualquier cosa, ¡imagino que le gustaría que su navegador le informara si se espera JSON pero se recibe JSON no válido (al igual que los usuarios por proxy de algún mensaje de error significativo)!
Por lo tanto, hacer una regex completa para JSON es innecesario (como sería, en mi experiencia, para la mayoría de los casos de uso). Probablemente sería mejor usar algo como lo siguiente:
eso debería evitar que tenga que manejar un código no JSON válido y cuidar de duff json al mismo tiempo.
fuente
Espero que esto funcione para usted también
fuente
Si hay errores, devuelva falso.
Si no hay errores, devuelva datos json
fuente
Puede usar la función de evaluación de JavaScript () para verificar si es válida.
p.ej
Alternativamente, puede usar la
JSON.parse
función de json.org :Espero que esto ayude.
ADVERTENCIA :
eval()
es peligroso si alguien agrega código JS malicioso, ya que lo ejecutará. Asegúrese de que la cadena JSON sea confiable , es decir, la obtuvo de una fuente confiable.Editar Para mi primera solución, se recomienda hacer esto.
Para garantizar json-ness. Si el
jsonString
JSON no es puro, la evaluación arrojará una excepción.fuente
Oh, definitivamente puedes usar try catch para verificar si es o no un JSON válido
Probado en Firfox Quantom 60.0.1
use la función dentro de una función para hacer que se pruebe el JSON y use esa salida para validar la cadena. escucha un ejemplo.
fuente
La función
IsJsonString(str)
, que está usandoJSON.parse(str)
, no funciona en mi caso.Intenté validar la salida json de GraphiQL , siempre devuelve falso. Por suerte, isJSON funciona mejor:
Salida de muestra:
fuente
Para las personas a las que les gusta la convención .Net de funciones "probar" que devuelven un valor booleano y manejan un parámetro byref que contiene el resultado. Si no necesita el parámetro out, puede omitirlo y simplemente usar el valor de retorno.
StringTests.js
StringUtils.js
ObjectUtils.js
fuente
Código de línea simple muy simple (pero enfoque de Hacky)
fuente