Algo como:
var jsonString = '{ "Id": 1, "Name": "Coke" }';
//should be true
IsJsonString(jsonString);
//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")
A solução não deve conter tentativa / captura. Alguns de nós ativam a opção "interromper todos os erros" e não gostam do quebra do depurador nessas cadeias JSON inválidas.
javascript
json
Chi Chan
fonte
fonte
try
?Respostas:
Um comentário primeiro. A questão era sobre não usar
try/catch
.Se você não se importa de usá-lo, leia a resposta abaixo. Aqui, apenas verificamos uma
JSON
string usando um regexp, e ele funcionará na maioria dos casos, não em todos os casos.Dê uma olhada na linha 450 em https://github.com/douglascrockford/JSON-js/blob/master/json2.js
Existe um regexp que verifica um JSON válido, algo como:
EDIT : A nova versão do json2.js faz uma análise mais avançada que a anterior, mas ainda com base na substituição de uma expressão regular (a partir do comentário de @Mrchief )
fonte
Use um analisador JSON como
JSON.parse
:fonte
JSON.parse("false")
avalia como falso também.Eu sei que estou 3 anos atrasado para esta pergunta, mas eu senti vontade de comentar.
Embora a solução da Gumbo funcione bem, ela não lida com alguns casos em que nenhuma exceção é levantada para
JSON.parse({something that isn't JSON})
Também prefiro retornar o JSON analisado ao mesmo tempo, para que o código de chamada não precise chamar
JSON.parse(jsonString)
uma segunda vez.Isso parece funcionar bem para minhas necessidades:
fonte
o && o !== null
é supérfluo.undefined
, nãofalse
porquefalse
é uma string json válida e não há como diferenciar entretryParseJSON("false")
etryParseJSON("garbage")
Uso:
isJSON({})
seráfalse
,isJSON('{}')
serátrue
.Para verificar se algo é um
Array
ouObject
( JSON analisado ):Uso:
isAO({})
serátrue
,isAO('{}')
seráfalse
.fonte
null
passa nessa validação.return !!(JSON.parse(str) && str);
deve bloquear valores nulos. Vou atualizar a resposta com este código.parse()
teste, causando WTFs.Aqui meu código de trabalho:
fonte
typeof str === 'string'
Eu usei um método muito simples para verificar uma string como é um JSON válido ou não.
Resultado com uma sequência JSON válida:
Resultado com uma string simples;
Resultado com um objeto:
Resultado com entrada nula:
O último retorna false porque o tipo de variáveis nulas é objeto.
Isso funciona sempre. :)
fonte
null
input retorna false. Mas a entrada "false" é uma sequência JSON válida. Isso será analisadoboolean (false)
. Agora eu modifico o código para ser mais preciso.No prototypeJS, temos o método isJSON . Você pode tentar isso. Até o json pode ajudar.
fonte
"{ foo: 42 }".isJSON()
? Sefalse
, como eu suponho (o resultado deve seguir a função do documento), então uma boa pergunta é: por que é falso?{ foo: 42 }
parece ser JSON perfeitamente válido.Da
String.isJSON
definição da estrutura Prototype aquientão esta é a versão que pode ser usada passando um objeto string
fonte
Eu usei o JQuery para analisar cadeias JSON e usei a instrução trycatch para lidar com exceções, mas o lançamento de exceções para cadeias não analisáveis diminuiu a velocidade do meu código, então usei o Regex simples para verificar a cadeia, se é uma possível cadeia JSON ou não sem pena verificando sua sintaxe, usei o modo regular analisando a string usando o JQuery:
fonte
Talvez seja útil:
resultado:
IE7: string , objeto, string, string
CHROME: objeto, objeto, string, string
fonte
Eu acho que sei por que você quer evitar isso. Mas talvez tente e pegue! == tente e pegue. ; o) Isso me veio à mente:
Portanto, você também pode clipe sujo para o objeto JSON, como:
Como isso é o mais encapsulado possível, pode não ocorrer erro.
fonte
Aqui está a versão datilografada também:
fonte
fonte
Eu deduzo do comentário de abertura que o caso de uso está descrevendo se uma resposta é HTML ou JSON. Nesse caso, quando você faz receber JSON, você provavelmente deveria ser analisá-lo e lidar com JSON inválido em algum momento de seu código de qualquer maneira. Além de tudo, imagino que você gostaria de ser informado pelo seu navegador, caso o JSON seja esperado, mas o JSON inválido seja recebido (assim como os usuários por proxy de alguma mensagem de erro significativa)!
Portanto, fazer um regex completo para JSON é desnecessário (como seria - na minha experiência - para a maioria dos casos de uso). Você provavelmente seria melhor usar algo como o abaixo:
isso evita que você precise manipular códigos não JSON válidos e cuidar do duff json ao mesmo tempo.
fonte
Espero que isto funcione para você também
fonte
Se houver erros, retorne false.
Se não houver erros, retorne dados json
fonte
Você pode usar o javascript eval () para verificar se é válida.
por exemplo
Como alternativa, você pode usar a
JSON.parse
função do json.org :Espero que isto ajude.
AVISO :
eval()
é perigoso se alguém adicionar código JS malicioso, pois ele será executado. Verifique se a string JSON é confiável , ou seja, de uma fonte confiável.Editar Para minha primeira solução, é recomendável fazer isso.
Para garantir json-ness. Se o
jsonString
JSON não for puro, o eval lançará uma exceção.fonte
Ah, você definitivamente pode usar o try catch para verificar se é ou não um JSON válido
Testado no Firfox Quantom 60.0.1
use function dentro de uma função para testar o JSON e use essa saída para validar a sequência. ouve um exemplo.
fonte
A função
IsJsonString(str)
que está sendo usadaJSON.parse(str)
não funciona no meu caso.Eu tentei validar a saída json do GraphiQL, ela sempre retorna falsa. Sorte minha, isJSON funciona melhor:
Saída de amostra:
fonte
Para pessoas que gostam da convenção .Net de funções "try" que retornam um booleano e manipulam um parâmetro byref contendo o resultado. Se você não precisar do parâmetro out, poderá omiti-lo e apenas usar o valor de retorno.
StringTests.js
StringUtils.js
ObjectUtils.js
fonte
Código de uma linha muito simples (mas abordagem Hacky)
fonte