Eu tenho uma chamada AJAX simples e o servidor retornará uma sequência JSON com dados úteis ou uma sequência de mensagens de erro produzida pela função PHP mysql_error()
. Como posso testar se esses dados são uma string JSON ou a mensagem de erro.
Seria bom usar uma função chamada, isJSON
assim como você pode usá-la instanceof
para testar se algo é uma matriz.
É isso que eu quero:
if (isJSON(data)){
//do some data stuff
}else{
//report the error
alert(data);
}
javascript
mysql
json
jeffery_the_wind
fonte
fonte
eval()
se ele retornarundefined
, então, não é JSONRespostas:
Use JSON.parse
fonte
JSON.parse(1234)
OUJSON.parse(0)
OUJSON.parse(false)
OUJSON.parse(null)
todos não gerarão Exceção e retornarão verdadeiro !!. não use esta resposta1234
,0
,false
, enull
são todos valores JSON válido. Se você deseja um predicado que testa se o JSON representa um objeto, precisará fazer um pouco mais.JSON.parse
faz muita computação para analisar a string e fornecer o objeto json, se for bem-sucedido, mas você está descartando o resultado que alguns usuários podem querer usar. Isso não parece ser bom. Eu prefeririareturn {value: JSON.parse(str), valid: true};
e no bloco catchreturn {value: str, valid: false};
... e mudaria o nome da função paratryParse()
.Este código é
JSON.parse(1234)
ouJSON.parse(0)
ouJSON.parse(false)
ouJSON.parse(null)
todos retornarão true.Então, eu reescrevi o código desta maneira:
Resultado do teste:
resultado do teste isJson
fonte
return (typeof suspect === "object" && suspect !== null);
Vamos recapitular isso (para 2019+).
FATO : Esses valores primitivos são analisáveis por JSON, mas não são estruturas JSON bem formadas . A especificação JSON indica que o JSON se baseia em duas estruturas: Uma coleção de pares nome / valor (objeto) ou uma lista ordenada de valores (matriz).
FATO : Não! Definitivamente, é legal usar try / catch, especialmente em um caso como este. Caso contrário, você precisará fazer muitas coisas de análise de string, como operações de tokenizing / regex; o que teria um desempenho terrível.
hasJsonStructure()
Isso é útil se seu objetivo é verificar se alguns dados / texto possuem o formato de intercâmbio JSON adequado.
Uso:
safeJsonParse()
E isso é útil se você quiser ter cuidado ao analisar alguns dados para um valor JavaScript.
Uso:
fonte
Se o servidor estiver respondendo com JSON, ele terá um
application/json
tipo de conteúdo; se estiver respondendo com uma mensagem de texto sem formatação, deverá ter umtext/plain
tipo de conteúdo. Verifique se o servidor está respondendo com o tipo de conteúdo correto e teste-o.fonte
overrideMimeType
pode substituir o cabeçalho do tipo de conteúdo.ao usar
jQuery $.ajax()
a resposta terá aresponseJSON
propriedade se a resposta for JSON, isso pode ser verificado assim:fonte
Eu gosto da melhor resposta, mas se for uma string vazia, ela retornará true. Então, aqui está uma correção:
fonte
No entanto, sugerirei que sua chamada / serviço http sempre retorne dados no mesmo formato. Portanto, se você tiver um erro, deverá ter um objeto JSON que envolva esse erro:
E talvez use, além do status HTTP, um código 5xx.
fonte
Bem ... Depende da maneira como você está recebendo seus dados. Eu acho que o servidor está respondendo com uma string formatada em JSON (usando json_encode () no PHP, por exemplo). Se você estiver usando a postagem do JQuery e definir os dados de resposta para um formato JSON e for um JSON malformado, isso produzirá um erro:
Mas, se você estiver usando a resposta de tipo como texto, precisará usar $ .parseJSON. De acordo com o site jquery: "A transmissão de uma string JSON malformada pode resultar no lançamento de uma exceção". Assim, seu código será:
fonte
response
esteja vazia, ela irá parasuccess
: '(Provavelmente, existem testes que você pode fazer, por exemplo, se você sabe que o JSON retornado sempre será cercado
{
e, em}
seguida, você pode testar esses caracteres ou algum outro método hacky. Ou você pode usar a biblioteca JS json.org para tentar analisá-la e testar se ela foi bem-sucedida.No entanto, eu sugeriria uma abordagem diferente. Seu script PHP atualmente retorna JSON se a chamada for bem-sucedida, mas outra coisa se não for. Porque nem sempre retornar JSON?
Por exemplo
Chamada bem sucedida:
Chamada incorreta:
Isso tornaria muito mais fácil escrever o JS do lado do cliente - tudo o que você precisa fazer é verificar o membro "status" e agir de acordo.
fonte
Eu uso apenas 2 linhas para fazer isso:
Isso é tudo!
Mas lembre-se de que existem 2 traps:
1.
JSON.parse(null)
retornanull
2. Qualquer número ou string pode ser analisado com o
JSON.parse()
método.JSON.parse("5")
retorna5
JSON.parse(5)
retorna5
Vamos jogar alguns códigos:
fonte
[
e]
. Por exemplo,[1, 2, 3]
é uma matriz numérica.["a", "b", "c"]
é uma matriz de cadeias de caracteres. E[{"a":1}, {"b":2}]
é uma matriz JSON. Seu trabalho com o jsfiddle parece realmente útil!JSON.parse
. Alguém pode aconselhar como evitar esse erro sem usar try?jsfiddle
aplicativo gera um erro porque o Teste 3 não possui uma expressão JSON válida. Portanto, umtry-catch
deve ser usado para capturar esse erro e avaliar qualquer erro, pois a expressão não é JSON ao analisar como o Teste 3 acima:try { JSON.parse(data3) } catch(e) { isValidJSON = false }
Você pode tentar decodificá-lo e capturar a exceção (nativo ou json2.js ):
No entanto, sugiro que a resposta seja sempre JSON válida. Se você receber um erro de volta da sua consulta MySQL, basta enviar de volta o JSON com o erro:
E depois:
fonte
Aviso: Para métodos baseados em
JSON.parse
- matrizes e strings entre aspas também passarão (isto éconsole.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
) .Para evitar todas as primitivas JSON que não são objetos (booleano, nulo, matriz, número, cadeia de caracteres), sugiro o seguinte:
Código Explicação
Por que não usar a resposta hasJsonStructure ()?
Confiar
toString()
não é uma boa ideia. Isso ocorre porque diferentes mecanismos JavaScript podem retornar uma representação de sequência diferente. Em geral, os métodos que dependem disso podem falhar em ambientes diferentes ou podem estar sujeitos a falhas posteriormente, caso o mecanismo altere o resultado da stringPor que pegar uma exceção não é um hack?
Foi levantado que capturar uma exceção para determinar a validade de algo nunca é o caminho certo a seguir. Geralmente, esse é um bom conselho, mas nem sempre. Nesse caso, é provável que a captura de exceções seja a melhor rota, pois depende da implementação do mecanismo JavaScript de validar dados JSON.
Confiar no mecanismo JS oferece as seguintes vantagens:
Quando tiver a oportunidade de usar o mecanismo JavaScript, sugiro fazê-lo. Particularmente nesse caso. Embora possa parecer hacky capturar uma exceção, você está realmente apenas lidando com dois possíveis estados de retorno de um método externo.
fonte
Aqui está um código com algumas pequenas modificações na resposta de Bourne. Como JSON.parse (number) funciona bem sem nenhuma exceção, o isNaN adicionado.
fonte
Todas as strings json começam com '{' ou '[' e terminam com o correspondente '}' ou ']', portanto, verifique isso.
Veja como o Angular.js faz isso:
https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js
fonte
{ someValue }
passará automaticamente na validação.Eu sugiro no modo TypeScript:
fonte
Eu usei este (tipo de mistura de respostas diferentes, mas de qualquer maneira):
fonte
Você pode tentar o seguinte, porque também valida número, nulo, sequência, mas a resposta acima marcada não está funcionando corretamente, é apenas uma correção da função acima:
fonte
Além das respostas anteriores, no caso de você precisar validar um formato JSON como "{}", você pode usar o seguinte código:
Exemplos de uso: