J'ai besoin d'une méthode vraiment, vraiment rapide pour vérifier si une chaîne est JSON ou non. J'ai l'impression que ce n'est pas la meilleure façon:
function isJson($string) {
return ((is_string($string) &&
(is_object(json_decode($string)) ||
is_array(json_decode($string))))) ? true : false;
}
Des amateurs de performances veulent améliorer cette méthode?
php
json
error-handling
json-deserialization
jsonresult
Kirk Ouimet
la source
la source
json_decode
fois ... vérifiez également les valeurs d'entrée et de retour dejson_decode
.Réponses:
la source
{
,[
ou premier symbole de tout autre littéral peut accélérer considérablement potentiellement celui - ci lorsque la plupart des chaînes entrantes devraient être non JSON.6.5 = true, '300' = true, 9 = true
etc. Il peut donc s'agir d'une valeur JSON valide mais la fonction peut ne pas se comporter comme prévu, si vous souhaitez rechercher uniquement des chaînes JSON valides avec{}
ou[]
;La fonction
json_last_error
renvoie la dernière erreur survenue lors de l'encodage et du décodage JSON. Donc, le moyen le plus rapide de vérifier le JSON valide estNotez que cela
json_last_error
n'est pris en charge qu'en PHP> = 5.3.0.Il est toujours bon de connaître l'erreur exacte pendant le temps de développement. Voici un programme complet pour vérifier l'erreur exacte sur la base des documents PHP.
Étant donné que
json_last_error
n'est pas pris en charge en PHP 5.2, vous pouvez vérifier si l'encodage ou le décodage retourne booléenFALSE
. Voici un exempleJ'espère que cela vous sera utile. Codage heureux!
la source
((strlen($json) === 5) && ($json !== 'false'))
devrait également être entreprise pour éviter ce bord?json_last_error
revientJSON_ERROR_NONE
.Tout ce que vous devez vraiment faire, c'est ceci ...
Cette demande ne nécessite même pas de fonction distincte. Enroulez simplement is_object autour de json_decode et continuez. Il semble que cette solution incite les gens à y réfléchir beaucoup trop.
la source
is_array
en plus deis_object
, sinonis_object
, retournera false pour les tableaux simples encodés en JSON. Donc @ggutenberg a raison dans ce cas. Passer l'argument true pourjson_decode
forcer un objet à être renvoyé sous forme de tableau. Vous pourriez en théorie toujours forcer le décodage vers un tableau et juste vérifieris_array
, cela devrait fonctionner.json_encode($array)
pour un tableau PHP simple, puis-json_decode($str)
je recevoir un objet, mais pas un tableau.json_decode($str, true)
force à convertir en tableau. Pourquoi une chaîne compliquée dans votre code? Vérifiezis_array(json_decode($str, true))
et quelque temps plus tard, lorsque vous le lirez, vous comprendrez que le décodage ne doit être qu'un tableau. Beaucoup plus difficile à devineris_object(json_decode($MyJSONArray))
"Oh, ici je vérifie que le décodage est un tableau ou non?"json_decode
à renvoyer un tableau pour vous éviter de vérifier l'objet et le tableau, mais si vous ne le faites pas ET vousjson_decode
quoi était un simple tableau pour commencer, vous recevrez un tableau en retour lors du décodage, pas un objet. Vous devez utiliserJSON_FORCE_OBJECT
si vous souhaitez toujours forcer un objet à encoder IF en passant un simple tableau.This request does not require a separate function even
. À strictement parler, aucune solution ne nécessite une fonction distincte. Le but d'une fonction n'est pas de faire ressembler plusieurs lignes de code à une seule ligne de code. Le but de la fonction est de rendre le processus de vérification JSON standard partout dans votre application, afin que différents programmeurs (ou le même programmeur au fil du temps) n'utilisent pas de procédures de vérification différentes à différentes étapes du flux du programme.Utiliser
json_decode
pour "sonder" ce n'est peut-être pas le moyen le plus rapide. S'il s'agit d'une structure profondément imbriquée, instancier de nombreux objets de tableaux pour les jeter est une perte de mémoire et de temps.Il pourrait donc être plus rapide à utiliser
preg_match
et RFC4627 regex aussi assurer la validité :La même chose en PHP:
Cependant, pas assez d'un passionné de performance pour se soucier des repères.
la source
json_decode
est toujours plus rapide qu'une expression régulière PCRE. (Bien qu'il ne soit pas très optimisé, aucun test synthétique n'a été trouvé et pourrait se comporter différemment en Perl ..)\r
\n
\t
cela n'a de sens que si PHP ne les interpole pas, mais laisse PCRE les interpréter (seul était requis pour le/x
mode). Les autres événements n'en ont pas strictement besoin; pourtant, "la barre oblique inverse s'échappe" dans tous les contextes PHP de chaîne. On pourrait donc le considérer comme plus exact.Cela retournera vrai si votre chaîne représente un tableau ou un objet json :
Il rejette les chaînes json qui ne contiennent qu'un nombre, une chaîne ou un booléen, bien que ces chaînes soient techniquement valides json.
C'est le moyen le plus court que je puisse trouver.
la source
var_dump(isJson('[]')); // bool(false)
. Selon la documentation sur les booléens, c'est parce que PHP évalue les tableaux avec zéro élément comme faux. Voici une modification mineure pour ajuster la déclaration de retour; il effectue une comparaison identique sur la sortie décodée qui gère ce cas:return $json !== false && $str != $json;
isJson('hello')
true, ce qui n'est pas un json valide. La comparaison lâche est choisie exprès ici. Je n'ai pas de solution rapide pour la situation tableau / objet vide, sauf un laidreturn $json == '[]' || ...
Le moyen le plus simple et le plus rapide que j'utilise est le suivant;
C'est parce que json_decode () renvoie NULL si la chaîne entrée n'est pas json ou json invalide.
Fonction simple pour valider JSON
Si vous devez valider votre JSON à plusieurs endroits, vous pouvez toujours utiliser la fonction suivante.
Dans la fonction ci-dessus, vous obtiendrez true en retour s'il s'agit d'un JSON valide.
la source
json_decode('null') == NULL
etnull
est une valeur JSON valide.JSON.parse('null')
dans votre console de développement.http://tr.php.net/manual/en/function.json-decode.php la valeur de retour est nulle lorsqu'un encodage non valide a été détecté.
la source
json_decode($str)!=null;
sinon la fonction devrait être appeléeis_not_json
.json_decode('null')
est un JSON valide selon la spécification et doit renvoyer la valeur denull
.is_json('false')
et que le type deis_json('[]')
retourfalse
ne sera pas vérifié. Je pense que cette méthode devrait plutôt revenir$str === null || json_decode($str) !== null
.Vous devez valider votre entrée pour vous assurer que la chaîne que vous passez n'est pas vide et est en fait une chaîne. Une chaîne vide n'est pas un JSON valide.
Je pense qu'en PHP, il est plus important de déterminer si l'objet JSON a même des données, car pour utiliser les données, vous devrez appeler
json_encode()
oujson_decode()
. Je suggère de refuser les objets JSON vides afin de ne pas exécuter inutilement les encodages et décodages sur les données vides.la source
'0'
n'est pas valide json ... pourquoi devrais-je me méfier? @KzqaiCela le fera:
Comme indiqué dans d'autres réponses,
json_last_error()
retourne toute erreur de notre dernier json_decode (). Cependant, il existe certains cas d'utilisation de pointe où cette fonction seule n'est pas suffisamment complète. Par exemple, si vous êtesjson_decode()
un entier (par exemple:)123
, ou une chaîne de nombres sans espaces ou autres caractères (par exemple:)"123"
, lajson_last_error()
fonction ne détectera pas d'erreur.Pour lutter contre cela, j'ai ajouté une étape supplémentaire qui garantit que le résultat de notre
json_decode()
soit un objet ou un tableau. Si ce n'est pas le cas, nous revenonsfalse
.Pour voir cela en action, vérifiez ces deux exemples:
json_last_error()
la source
"hello"
est un JSON valide, et ce n'est pas un objet ni un tableau,json_last_error()
json_last_error()
renvoie un code d'erreur4
lorsque vousjson_decode()
la chaîne"hello"
. Exemple ici: 3v4l.org/lSsEohello
n'est pas un JSON valide, mais"hello"
est 3v4l.org/OEJrQLa méthode la plus simple consiste à vérifier le résultat json.
la source
dans GuzzleHttp :
la source
Plus tôt, je vérifiais simplement une valeur nulle, ce qui était faux en fait.
Le morceau de code ci-dessus fonctionne correctement avec les chaînes. Cependant, dès que je fournis un numéro, il se casse, par exemple.
Pour y remédier, ce que j'ai fait était très simple.
la source
la source
Un autre moyen simple
la source
json_decode($str,true)
permet de convertir des objets en tableaux afin qu'il passe la vérification is_array. Vous corrigez cependant les chaînes, les entiers, etc.Nous devons vérifier si la chaîne passée n'est pas numérique car dans ce cas json_decode ne déclenche aucune erreur.
la source
J'ai trouvé cette question après avoir rencontré quelque chose de similaire dans mon travail, hier. Ma solution à la fin était un hybride de certaines des approches ci-dessus:
la source
J'ai essayé certaines de ces solutions mais rien ne fonctionnait pour moi. J'essaie cette chose simple:
Je pense que c'est une bonne solutiuon puisque le décodage JSON sans le second paramètre donne un objet.
EDIT: Si vous savez quelle sera l'entrée, vous pouvez adapter ce code à vos besoins. Dans mon cas, je sais que j'ai un Json qui commence par "{", donc je n'ai pas besoin de vérifier s'il s'agit d'un tableau.
la source
En utilisant PHPBench avec la classe suivante, les résultats ci-dessous ont été obtenus:
Conclusion: le moyen le plus rapide de vérifier si json est valide est de revenir
json_decode($json, true) !== null)
.la source
Je ne connais pas les performances ou l'élégance de ma solution, mais c'est ce que j'utilise:
Étant donné que toutes mes chaînes codées JSON commencent par {", il suffit de tester cela avec un RegEx. Je ne suis pas du tout à l'aise avec RegEx, donc il pourrait y avoir une meilleure façon de le faire. Aussi: strpos () pourrait être plus rapide.
J'essaye juste de donner ma valeur de tuppence.
PS Nous venons de mettre à jour la chaîne RegEx
/^[\[\{]\"/
pour trouver également les chaînes de tableau JSON. Il recherche donc maintenant ["ou {" au début de la chaîne.la source
Devrait être quelque chose comme ça:
Test de l'unité
la source
ErrorException
si la chaîne est un tableau ou un objet.Développer cette réponse Que diriez-vous de ce qui suit:
la source
Salut, voici un petit extrait de ma bibliothèque, dans cette première condition, je vérifie simplement si les données sont json puis les retourne si elles sont correctement décodées, veuillez noter l'utilisation de substr pour les performances (je n'ai encore vu aucun fichier json ne commençant pas non plus) par {ou [
source
Une autre suggestion de moi :)
source
La fonction personnalisée
Étuis
Ressources
https://gist.github.com/rafasashi/93d06bae83cc1a1f440b
source
Fonction fraîchement conçue pour la compatibilité PHP 5.2, si vous avez besoin des données décodées en cas de succès:
Usage:
Quelques tests:
source
source
Une simple modification de la réponse de henrik pour toucher la plupart des possibilités requises.
(y compris "{} et []")
la source
Le moyen le plus rapide de décoder peut-être un objet JSON possible en un objet / tableau PHP:
la source
Voici une fonction performante et simple que j'ai créée (qui utilise la validation de chaîne de base avant d'utiliser
json_decode
pour des chaînes plus grandes):la source