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:
/* Validate a possible object ie. o = { "a": 2 } */
const isJSONObject = (o) =>
!!o && (typeof o === 'object') && !Array.isArray(o) &&
(() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()
/* Validate a possible JSON object represented as string ie. s = '{ "a": 3 }' */
function isJSONObjectString(s) {
try {
const o = JSON.parse(s);
return !!o && (typeof o === 'object') && !Array.isArray(o)
} catch {
return false
}
}
Explication du code
- !! o - Non faux (exclut null, qui s'enregistre comme typeof 'object')
- (typeof o === 'objet') - Exclut le booléen, le nombre et la chaîne
- ! Array.isArray (o) - Exclut les tableaux (qui s'inscrivent comme typeof 'object')
- try ... JSON.stringify / JSON.parse - Demande au moteur JavaScript de déterminer si JSON valide
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îne
Pourquoi 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:
- Plus complet et continuellement à jour à mesure que les spécifications JSON changent
- Probablement plus rapide (car il s'agit d'un code de niveau inférieur)
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.
eval()
s'il retourneundefined
alors, ce n'est pas JSON