Quelque chose comme:
var jsonString = '{ "Id": 1, "Name": "Coke" }';
//should be true
IsJsonString(jsonString);
//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")
La solution ne doit pas contenir try / catch. Certains d'entre nous activent "pause sur toutes les erreurs" et ils n'aiment pas que le débogueur se casse sur ces chaînes JSON invalides.
javascript
json
Chi Chan
la source
la source
try
?Réponses:
Un commentaire d'abord. La question était de ne pas utiliser
try/catch
.Si cela ne vous dérange pas de l'utiliser, lisez la réponse ci-dessous. Ici, nous vérifions simplement une
JSON
chaîne à l'aide d'une expression rationnelle, et cela fonctionnera dans la plupart des cas, pas dans tous les cas.Jetez un œil à la ligne 450 dans https://github.com/douglascrockford/JSON-js/blob/master/json2.js
Il y a une expression rationnelle qui vérifie un JSON valide, quelque chose comme:
EDIT : La nouvelle version de json2.js fait une analyse plus avancée que ci-dessus, mais toujours basée sur un remplacement regexp (d'après le commentaire de @Mrchief )
la source
Utilisez un analyseur JSON comme
JSON.parse
:la source
JSON.parse("false")
Equivaut à faux ainsi.Je sais que j'ai 3 ans de retard par rapport à cette question, mais j'avais envie d'intervenir.
Bien que la solution de Gumbo fonctionne très bien, elle ne gère pas quelques cas où aucune exception n'est levée pour
JSON.parse({something that isn't JSON})
Je préfère également renvoyer le JSON analysé en même temps, afin que le code appelant n'ait pas à appeler
JSON.parse(jsonString)
une deuxième fois.Cela semble bien fonctionner pour mes besoins:
la source
o && o !== null
est superflu.undefined
, non pasfalse
parce qu'ilfalse
s'agit d'une chaîne json valide et qu'il n'y a aucun moyen de différencier entretryParseJSON("false")
ettryParseJSON("garbage")
Utilisation:
isJSON({})
serafalse
,isJSON('{}')
seratrue
.Pour vérifier si quelque chose est un
Array
ouObject
( JSON analysé ):Utilisation:
isAO({})
seratrue
,isAO('{}')
serafalse
.la source
null
passe cette validation.return !!(JSON.parse(str) && str);
devrait bloquer les valeurs nulles. Je mettrai à jour la réponse avec ce code.parse()
test, provoquant des WTF.Voici mon code de travail:
la source
typeof str === 'string'
J'ai utilisé une méthode très simple pour vérifier si une chaîne est un JSON valide ou non.
Résultat avec une chaîne JSON valide:
Résultat avec une chaîne simple;
Résultat avec un objet:
Résultat avec entrée nulle:
Le dernier retourne false car le type des variables nulles est object.
Cela fonctionne à chaque fois. :)
la source
null
entrée rend faux. Mais l'entrée "false" est une chaîne JSON valide. Ce sera analyséboolean (false)
. Maintenant, je modifie le code pour être plus précis.Dans prototypeJS, nous avons la méthode isJSON . Vous pouvez essayer ça. Même json pourrait aider.
la source
"{ foo: 42 }".isJSON()
? Sifalse
, comme je le suppose (le résultat doit suivre la fonction du document), alors la bonne question est, pourquoi est-ce faux?{ foo: 42 }
semble être parfaitement JSON valide.De la
String.isJSON
définition du cadre du prototype icic'est donc la version qui peut être utilisée en passant un objet chaîne
la source
J'ai utilisé JQuery pour analyser les chaînes JSON et j'ai utilisé l'instruction trycatch pour gérer les exceptions, mais le lancement d'exceptions pour les chaînes non analysables a ralenti mon code, j'ai donc utilisé Regex simple pour vérifier la chaîne s'il s'agit d'une chaîne JSON possible ou non sans aller de plume en vérifiant sa syntaxe, j'ai ensuite utilisé la méthode habituelle en analysant la chaîne à l'aide de JQuery:
la source
Peut-être que cela sera utile:
production:
IE7: chaîne , objet, chaîne, chaîne
CHROME: objet, objet, chaîne, chaîne
la source
Je pense que je sais pourquoi vous voulez éviter cela. Mais peut-être essayer et attraper! == essayer et attraper. ; o) Cela m'est venu à l'esprit:
Ainsi, vous pouvez également ajouter un clip sale à l'objet JSON, comme:
Comme cela est aussi encapsulé que possible, il ne peut pas se casser en cas d'erreur.
la source
Voici également la version dactylographiée:
la source
la source
Je déduis du commentaire d'ouverture que le cas d'utilisation délimite si une réponse est HTML ou JSON. Dans ce cas, lorsque vous faites recevoir JSON, vous devriez probablement être l' analyse et la manipulation JSON invalide à un moment donné dans votre code de toute façon. En plus de tout, j'imagine que vous aimeriez être informé par votre navigateur si JSON était attendu mais JSON invalide reçu (tout comme les utilisateurs par proxy d'un message d'erreur significatif)!
Il n'est donc pas nécessaire de faire une regex complète pour JSON (comme ce serait - selon mon expérience - pour la plupart des cas d'utilisation). Vous feriez probablement mieux d'utiliser quelque chose comme ci-dessous:
cela devrait vous éviter d'avoir à gérer exceptionnellement du code non JSON valide et à prendre soin de duff json en même temps.
la source
j'espère que cela fonctionne aussi pour vous
la source
S'il y a des erreurs, retournez false.
S'il n'y a pas d'erreur, renvoyez les données json
la source
Vous pouvez utiliser la fonction javascript eval () pour vérifier si elle est valide.
par exemple
Alternativement, vous pouvez utiliser la
JSON.parse
fonction de json.org :J'espère que cela t'aides.
AVERTISSEMENT :
eval()
est dangereux si quelqu'un ajoute du code JS malveillant, car il l'exécutera. Assurez-vous que la chaîne JSON est fiable , c'est-à-dire que vous l'avez obtenue d'une source fiable.Modifier Pour ma 1ère solution, il est recommandé de le faire.
Pour garantir json-ness. Si le
jsonString
JSON n'est pas pur, l'eval lèvera une exception.la source
Oh, vous pouvez certainement utiliser try catch pour vérifier s'il s'agit ou non d'un JSON valide
Testé sur Firfox Quantom 60.0.1
utilisez la fonction à l'intérieur d'une fonction pour tester le JSON et utilisez cette sortie pour valider la chaîne. entend un exemple.
la source
La fonction
IsJsonString(str)
, qui utiliseJSON.parse(str)
, ne fonctionne pas dans mon cas.J'ai essayé de valider la sortie json de GraphiQL, elle retourne toujours false. Heureusement, isJSON fonctionne mieux:
Exemple de sortie:
la source
Pour les personnes qui aiment la convention .Net des fonctions "try" qui renvoient un booléen et gèrent un paramètre byref contenant le résultat. Si vous n'avez pas besoin du paramètre out, vous pouvez l'omettre et utiliser simplement la valeur de retour.
StringTests.js
StringUtils.js
ObjectUtils.js
la source
Code simple simple (approche Hacky)
la source