J'ai un simple appel AJAX et le serveur renverra soit une chaîne JSON avec des données utiles, soit une chaîne de message d'erreur produite par la fonction PHP mysql_error()
. Comment puis-je tester si ces données sont une chaîne JSON ou le message d'erreur.
Ce serait bien d'utiliser une fonction appelée isJSON
comme vous pouvez utiliser la fonction instanceof
pour tester si quelque chose est un tableau.
C'est ce que je veux:
if (isJSON(data)){
//do some data stuff
}else{
//report the error
alert(data);
}
javascript
mysql
json
jeffery_the_wind
la source
la source
eval()
s'il retourneundefined
alors, ce n'est pas JSONRéponses:
Utilisez JSON.parse
la source
JSON.parse(1234)
OUJSON.parse(0)
OUJSON.parse(false)
OUJSON.parse(null)
tout ne lèvera pas d'exception et retournera vrai !!. ne pas utiliser cette réponse1234
,0
,false
etnull
sont toutes les valeurs de JSON valides. Si vous voulez un prédicat qui teste si le JSON représente un objet, vous devrez en faire un peu plus.JSON.parse
fait beaucoup de calculs pour analyser la chaîne et vous donne l'objet json s'il réussit, mais vous rejetez le résultat que certains utilisateurs pourraient vouloir utiliser. Cela ne semble pas bon. Je voudrais plutôtreturn {value: JSON.parse(str), valid: true};
et dans le bloc catchreturn {value: str, valid: false};
.. et je changerais le nom de la fonction entryParse()
.Ce code est
JSON.parse(1234)
ouJSON.parse(0)
ouJSON.parse(false)
ouJSON.parse(null)
tout retournera vrai.J'ai donc réécrit le code de cette manière:
Résultat du test:
résultat du test isJson
la source
return (typeof suspect === "object" && suspect !== null);
Récapitulons ceci (pour 2019+).
FAIT : Ces valeurs primitives sont analysables par JSON mais ce ne sont pas des structures JSON bien formées . La spécification JSON indique que JSON repose sur deux structures: une collection de paires nom / valeur (objet) ou une liste ordonnée de valeurs (tableau).
FAIT : Non! Il est tout à fait légal d'utiliser try / catch, surtout dans un cas comme celui-ci. Sinon, vous devrez effectuer de nombreuses analyses de chaînes telles que des opérations de tokenisation / regex; ce qui aurait des performances terribles.
hasJsonStructure()
Ceci est utile si votre objectif est de vérifier si certaines données / textes ont le format d'échange JSON approprié.
Usage:
safeJsonParse()
Et cela est utile si vous voulez être prudent lors de l'analyse de certaines données en une valeur JavaScript.
Usage:
la source
Si le serveur répond avec JSON, il aura un
application/json
type de contenu, s'il répond avec un message en texte brut, il doit avoir untext/plain
type de contenu. Assurez-vous que le serveur répond avec le type de contenu correct et testez-le.la source
overrideMimeType
peut remplacer l'en-tête de type de contenu.lors de l'utilisation de
jQuery $.ajax()
la réponse aura laresponseJSON
propriété si la réponse était JSON, cela pourrait être vérifié comme ceci:la source
J'aime la meilleure réponse, mais s'il s'agit d'une chaîne vide, elle renvoie true. Alors, voici une solution:
la source
Cependant, je vais vous suggérer que votre appel / service http doit toujours renvoyer une donnée dans le même format. Donc, si vous avez une erreur, vous devriez avoir un objet JSON qui encapsule cette erreur:
Et peut-être utiliser ainsi que l'état HTTP un code 5xx.
la source
Eh bien ... Cela dépend de la façon dont vous recevez vos données. Je pense que le serveur répond avec une chaîne au format JSON (en utilisant json_encode () en PHP, par exemple). Si vous utilisez JQuery post et définissez les données de réponse au format JSON et qu'il s'agit d'un JSON malformé, cela produira une erreur:
Mais, si vous utilisez la réponse de type sous forme de texte, vous devez utiliser $ .parseJSON. Selon le site jquery: "La transmission d'une chaîne JSON mal formée peut entraîner la levée d'une exception". Ainsi votre code sera:
la source
response
est vide, elle ira àsuccess
: '(Il y a probablement des tests que vous pouvez faire, par exemple si vous savez que le JSON retourné sera toujours entouré par
{
et que}
vous pourriez alors tester ces caractères, ou une autre méthode hacky. Ou vous pouvez utiliser le json.org bibliothèque JS pour essayer de l'analyser et tester si elle réussit.Je suggérerais cependant une approche différente. Votre script PHP renvoie actuellement JSON si l'appel réussit, mais autre chose si ce n'est pas le cas. Pourquoi ne pas toujours renvoyer JSON?
Par exemple
Appel réussi:
Appel erroné:
Cela rendrait l'écriture de votre JS côté client beaucoup plus facile - tout ce que vous avez à faire est de vérifier le membre "status" et d'agir en conséquence.
la source
J'utilise juste 2 lignes pour effectuer cela:
C'est tout!
Mais gardez à l'esprit qu'il y a 2 pièges:
1.
JSON.parse(null)
renvoienull
2. N'importe quel nombre ou chaîne peut être analysé avec la
JSON.parse()
méthode.JSON.parse("5")
retourne5
JSON.parse(5)
retours5
Jouons un peu sur le code:
la source
[
et]
. Par exemple,[1, 2, 3]
est un tableau de nombres.["a", "b", "c"]
est un tableau de chaînes. Et[{"a":1}, {"b":2}]
est un tableau JSON. Votre travail jsfiddle semble vraiment utile!JSON.parse
. Quelqu'un peut-il conseiller comment éviter cette erreur sans utiliser try?jsfiddle
application génère une erreur car le test 3 n'a pas d'expression JSON valide. Donc, untry-catch
doit être utilisé pour attraper cette erreur et pour évaluer toute erreur car l'expression n'est pas JSON lors de l'analyse comme le test 3 ci-dessus:try { JSON.parse(data3) } catch(e) { isValidJSON = false }
Vous pouvez essayer de le décoder et d'attraper l' exception (native ou json2.js ):
Cependant, je suggérerais que la réponse soit toujours JSON valide. Si vous obtenez une erreur de votre requête MySQL, renvoyez simplement JSON avec l'erreur:
Puis:
la source
Attention: pour les méthodes reposant sur
JSON.parse
- Les tableaux et les guillemets entourés de chaînes passeront également (ie.console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
)Pour éviter toutes les primitives JSON non-objet (booléenne, null, tableau, nombre, chaîne), je suggère d'utiliser ce qui suit:
Explication du code
Pourquoi ne pas utiliser la réponse hasJsonStructure ()?
Reposant sur
toString()
n'est pas une bonne idée. En effet, différents moteurs JavaScript peuvent renvoyer une représentation sous forme de chaîne différente. En général, les méthodes qui reposent sur cela peuvent échouer dans différents environnements ou peuvent être sujettes à l'échec plus tard si le moteur change le résultat de la chaînePourquoi attraper une exception n'est-il pas un hack?
On a évoqué le fait qu'attraper une exception pour déterminer la validité de quelque chose n'est jamais la bonne voie à suivre. C'est généralement un bon conseil, mais pas toujours. Dans ce cas, la capture d'exceptions est probablement la meilleure voie, car elle repose sur l'implémentation du moteur JavaScript pour valider les données JSON.
S'appuyer sur le moteur JS offre les avantages suivants:
Lorsqu'on me donne la possibilité de s'appuyer sur le moteur JavaScript, je suggère de le faire. Surtout dans ce cas. Bien qu'il puisse se sentir hacky pour attraper une exception, vous êtes vraiment manipuler juste deux états de retour possible d'une méthode externe.
la source
Voici un code avec quelques modifications mineures dans la réponse de Bourne. Comme JSON.parse (nombre) fonctionne bien sans aucune exception, il a donc été ajouté isNaN.
la source
Toutes les chaînes json commencent par '{' ou '[' et se terminent par le '}' ou ']' correspondant, alors vérifiez simplement cela.
Voici comment Angular.js le fait:
https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js
la source
{ someValue }
passera automatiquement la validation.Je suggère en mode Typescript:
source
J'ai utilisé celui-ci (sorte de mélange de réponses différentes, mais de toute façon):
source
Vous pouvez essayer la suivante car elle valide également nombre, null, chaîne, mais la réponse indiquée ci-dessus ne fonctionne pas correctement, c'est juste une correction de la fonction ci-dessus:
source
En plus des réponses précédentes, au cas où vous auriez besoin de valider un format JSON tel que "{}", vous pouvez utiliser le code suivant:
Exemples d'utilisation: