Eu preciso de um método muito, muito rápido de verificar se uma string é JSON ou não. Eu sinto que esta não é a melhor maneira:
function isJson($string) {
return ((is_string($string) &&
(is_object(json_decode($string)) ||
is_array(json_decode($string))))) ? true : false;
}
Algum entusiasta de desempenho por aí quer melhorar esse método?
php
json
error-handling
json-deserialization
jsonresult
Kirk Ouimet
fonte
fonte
json_decode
uma vez ... também, verifique os valores de entrada e retorno dejson_decode
.Respostas:
fonte
{
,[
ou o primeiro símbolo de qualquer outro literal, pode potencialmente acelerar muito este quando se espera que muitas das cadeias de entrada não sejam JSON.6.5 = true, '300' = true, 9 = true
etc. Portanto, esse pode ser um valor JSON válido, mas a função pode não se comportar conforme o esperado, se você deseja verificar apenas as strings JSON válidas com{}
or[]
;A função
json_last_error
retorna o último erro ocorrido durante a codificação e decodificação JSON. Portanto, a maneira mais rápida de verificar o JSON válido éObserve que isso
json_last_error
é suportado apenas no PHP> = 5.3.0.É sempre bom saber o erro exato durante o tempo de desenvolvimento. Aqui está o programa completo para verificar o erro exato com base nos documentos do PHP.
Como
json_last_error
não é suportado no PHP 5.2, você pode verificar se a codificação ou decodificação retorna booleanoFALSE
. Aqui está um exemploEspero que isso seja útil. Feliz codificação!
fonte
((strlen($json) === 5) && ($json !== 'false'))
também deve ser realizada para evitar essa vantagem?json_last_error
retornaráJSON_ERROR_NONE
.Tudo o que você realmente precisa fazer é isso ...
Esta solicitação não requer uma função separada mesmo. Apenas envolva is_object em json_decode e siga em frente. Parece que esta solução faz com que as pessoas pensem demais nela.
fonte
is_array
além deis_object
, caso contráriois_object
, retornará false para matrizes simples codificadas como JSON. Então, @ggutenberg está certo neste caso. Passar o argumento verdadeiro parajson_decode
força um objeto a ser retornado como uma matriz. Em teoria, você sempre pode forçar a decodificação para uma matriz e apenas verificar seis_array
isso deve funcionar.json_encode($array)
para uma matriz PHP simples,json_decode($str)
receberei o objeto, mas não a matriz.json_decode($str, true)
obriga a converter em matriz. Por que seqüência complicada no seu código? Verifiqueis_array(json_decode($str, true))
e, algum tempo depois, quando o ler, entenderá que o decodificado deve ser apenas uma matriz. Muito mais difícil de adivinharis_object(json_decode($MyJSONArray))
"Oh, aqui estou verificando se um decodificado é uma matriz ou não?"json_decode
a retornar uma matriz para poupar a verificação de objeto e matriz, mas se você não o fizer, e você ojson_decode
que era uma matriz simples para começar, você receberá uma matriz em troca da decodificação, não um objeto. Você deve usarJSON_FORCE_OBJECT
se quiser sempre forçar um objeto a codificar se passar uma matriz simples.This request does not require a separate function even
. A rigor, nenhuma solução requer uma função separada. O objetivo de uma função não é fazer com que várias linhas de código se pareçam com uma linha de código. O objetivo da função é tornar o processo de verificação JSON padrão em qualquer lugar do seu aplicativo, para que diferentes programadores (ou o mesmo programador ao longo do tempo) não usem procedimentos de verificação diferentes em diferentes estágios do fluxo do programa.Usando
json_decode
para "sondar" pode não ser o caminho mais rápido. Se for uma estrutura profundamente aninhada, instanciar muitos objetos de matrizes para jogá-los fora é um desperdício de memória e tempo.Portanto, pode ser mais rápido usar
preg_match
o regex RFC4627 para garantir também a validade :O mesmo no PHP:
Um entusiasta do desempenho não é suficiente para se preocupar com benchmarks aqui, no entanto.
fonte
json_decode
é sempre mais rápido que um regex PCRE. (Embora não seja muito otimizado, há testes sintéticos encontrados, e pode se comportar de forma diferente em Perl ..)\r
\n
\t
faz sentido que o PHP não os interpole, mas permita que o PCRE os interprete (apenas foi necessário para o/x
modo). As outras ocorrências não precisam disso estritamente; ainda assim "a barra invertida se escapa" em todos os contextos de string do PHP. Portanto, pode-se considerar mais exato.Isso retornará true se sua string representar uma matriz ou objeto json :
Ele rejeita as strings json que contêm apenas um número, string ou booleano, embora essas strings sejam json tecnicamente válidas.
É a maneira mais curta que eu consigo.
fonte
var_dump(isJson('[]')); // bool(false)
. De acordo com a documentação sobre booleanos, isso ocorre porque o PHP avalia matrizes com zero elementos como falsos. Aqui está uma pequena alteração para ajustar a declaração de retorno; ele executa uma comparação idêntica na saída decodificada que lida com este caso:return $json !== false && $str != $json;
isJson('hello')
como verdadeira, o que não é válido json. A comparação frouxa é escolhida de propósito aqui. Eu não tenho uma solução rápida para a situação Array / objeto vazio, exceto um feioreturn $json == '[]' || ...
A maneira mais simples e rápida que eu uso é seguir;
Isso ocorre porque json_decode () retorna NULL se a sequência inserida não for json ou json inválido.
Função simples para validar JSON
Se você precisar validar seu JSON em vários locais, sempre poderá usar a seguinte função.
Na função acima, você retornará true se for um JSON válido.
fonte
json_decode('null') == NULL
enull
é um valor JSON válido.JSON.parse('null')
no seu console de desenvolvimento.O valor de retorno http://tr.php.net/manual/en/function.json-decode.php é nulo quando a codificação inválida é detectada.
fonte
json_decode($str)!=null;
deveria ser : ou então a função deve ser chamadais_not_json
.json_decode('null')
é JSON válido de acordo com a especificação e deve retornar o valor denull
.is_json('false')
eis_json('[]')
retornaráfalse
como o tipo não está marcado. Eu acho que esse método deveria retornar$str === null || json_decode($str) !== null
.Você deve validar sua entrada para garantir que a sequência que você passa não esteja vazia e seja, de fato, uma sequência. Uma cadeia vazia não é JSON válida.
Eu acho que no PHP é mais importante determinar se o objeto JSON ainda tem dados, porque para usar os dados que você precisará chamar
json_encode()
orjson_decode()
. Sugiro negar objetos JSON vazios para que você não esteja executando codificações e decodificações desnecessárias em dados vazios.fonte
'0'
não é válido json ... por que eu seria cauteloso? @KzqaiIsso fará isso:
Como mostrado em outras respostas,
json_last_error()
retorna qualquer erro do nosso último json_decode (). No entanto, existem alguns casos de uso de borda em que essa função sozinha não é abrangente o suficiente. Por exemplo, se você éjson_decode()
um número inteiro (por exemplo:)123
ou uma sequência de números sem espaços ou outros caracteres (por exemplo:"123"
:), ajson_last_error()
função não detectará um erro.Para combater isso, adicionei uma etapa extra que garante que o resultado da nossa
json_decode()
seja um objeto ou uma matriz. Se não for, então retornamosfalse
.Para ver isso em ação, verifique estes dois exemplos:
json_last_error()
fonte
"hello"
é um JSON válido, e não é um objeto nem um array,json_last_error()
é suficientejson_last_error()
retorna o código de erro4
quando vocêjson_decode()
a string"hello"
. Exemplo aqui: 3v4l.org/lSsEohello
não é um JSON válido, mas"hello"
é 3v4l.org/OEJrQO método fácil é verificar o resultado do json.
fonte
em GuzzleHttp :
fonte
No início eu estava apenas verificando um valor nulo, que estava errado na verdade.
O trecho de código acima funciona bem com seqüências de caracteres. No entanto, assim que eu forneço o número, ele se divide. Por exemplo.
Para corrigi-lo, o que eu fiz foi muito simples.
fonte
fonte
Outra maneira simples
fonte
json_decode($str,true)
faz com que ele converta objetos em matrizes para que passe na verificação is_array. Você corrige sobre strings, números inteiros, etc.Precisamos verificar se a sequência passada não é numérica porque, neste caso, json_decode não gera erro.
fonte
Encontrei essa pergunta depois de encontrar algo semelhante em meu trabalho, ontem. Minha solução no final foi um híbrido de algumas das abordagens acima:
fonte
Eu tentei algumas dessas soluções, mas nada estava funcionando para mim. Eu tento essa coisa simples:
Eu acho que é uma ótima solução, já que o JSON decodifica sem o segundo parâmetro dar um objeto.
EDIT: Se você souber qual será a entrada, poderá adaptar esse código às suas necessidades. No meu caso, eu sei que tenho um Json que começa com "{", então não preciso verificar se é um array.
fonte
Usando o PHPBench com a seguinte classe, os resultados abaixo foram alcançados:
Conclusão: A maneira mais rápida de verificar se o json é válido é retornar
json_decode($json, true) !== null)
.fonte
Não sei o desempenho ou a elegância da minha solução, mas é o que estou usando:
Como todas as minhas strings codificadas em JSON começam com {"basta testar isso com um RegEx. Eu não sou fluente com o RegEx, portanto pode haver uma maneira melhor de fazer isso. Além disso, strpos () pode ser mais rápido.
Apenas tentando ceder meu valor de tuppence.
PS: Atualizei a string RegEx
/^[\[\{]\"/
para também encontrar as strings da matriz JSON. Portanto, agora ele procura por ["ou {" no início da string.fonte
Deve ser algo como isto:
Teste de unidade
fonte
ErrorException
se a string é matriz ou objeto.Expandindo esta resposta Que tal o seguinte:
fonte
Olá, aqui está um pequeno trecho da minha biblioteca. Nesta primeira condição, estou apenas verificando se os dados são json e, em seguida, devolvemos se forem decodificados corretamente. por {ou [
fonte
Outra sugestão minha :)
fonte
A função personalizada
Estojos
Recursos
https://gist.github.com/ garrafasashi/93d06bae83cc1a1f440b
fonte
Função recém-criada para compatibilidade com o PHP 5.2, se você precisar dos dados decodificados com êxito:
Uso:
Alguns testes:
fonte
fonte
Uma modificação simples da resposta de henrik para tocar nas possibilidades mais necessárias.
(incluindo "{} e []")
fonte
A maneira mais rápida de talvez decodificar um possível objeto JSON para um objeto / matriz PHP:
fonte
Aqui está uma função simples e de desempenho que eu criei (que usa a validação básica de strings antes de usar
json_decode
para strings maiores):fonte