Comment analyser JSON en utilisant Node.js? Existe-t-il un module qui va valider et analyser JSON en toute sécurité?
javascript
json
node.js
Tikhon Jelvis
la source
la source
vous pouvez exiger des fichiers .json.
Par exemple, si vous avez un
config.json
fichier dans le même répertoire que votre fichier de code source, vous utiliseriez:ou (l'extension de fichier peut être omise):
notez qu'il
require
est synchrone et ne lit le fichier qu'une seule fois , les appels suivants renvoient le résultat du cacheNotez également que vous ne devez l'utiliser que pour les fichiers locaux sous votre contrôle absolu, car il exécute potentiellement tout code dans le fichier.
la source
require
c'est synchrone. Si vous souhaitez asynchroniser une utilisation conviviale à lafs.readFile
place avecJSON.parse
.json
extension! Si votre fichier n'a PAS l'.json
extension, require ne le traitera pas comme un fichier json.Vous pouvez utiliser
JSON.parse()
.Vous devriez pouvoir utiliser l'
JSON
objet sur n'importe quelle implémentation JavaScript compatible ECMAScript 5 . Et V8 , sur lequel Node.js est construit, en fait partie.Analyse d'une chaîne contenant des données JSON
Analyse d'un fichier contenant des données JSON
Vous devrez effectuer certaines opérations sur les fichiers avec le
fs
module.Version asynchrone
Version synchrone
Tu veux utiliser
require
? Détrompez-vous!Vous pouvez parfois utiliser
require
:Mais, je ne le recommande pas pour plusieurs raisons:
require
est synchrone. Si vous avez un très gros fichier JSON, il étouffera votre boucle d'événements. Vous devez vraiment l'utiliserJSON.parse
avecfs.readFile
.require
ne lira le fichier qu'une seule fois . Les appels suivants àrequire
pour le même fichier renverront une copie mise en cache. Ce n'est pas une bonne idée si vous souhaitez lire un.json
fichier mis à jour en continu. Vous pouvez utiliser un hack . Mais à ce stade, il est plus facile à utiliser simplementfs
..json
extension,require
ne traitera pas le contenu du fichier comme JSON.Sérieusement! Utilisez
JSON.parse
.load-json-file
moduleSi vous lisez un grand nombre de
.json
fichiers (et si vous êtes extrêmement paresseux), il devient ennuyeux d'écrire du code passe-partout à chaque fois. Vous pouvez enregistrer certains caractères en utilisant leload-json-file
module.Version asynchrone
Version synchrone
Analyser JSON à partir de flux
Si le contenu JSON est diffusé sur le réseau, vous devez utiliser un analyseur JSON en continu. Sinon, il bloquera votre processeur et étouffera votre boucle d'événements jusqu'à ce que le contenu JSON soit entièrement diffusé.
Il existe de nombreux packages disponibles dans NPM pour cela. Choisissez ce qui vous convient le mieux.
Traitement des erreurs / sécurité
Si vous ne savez pas si tout ce qui est transmis
JSON.parse()
est du JSON valide , assurez-vous de placer l'appel à l'JSON.parse()
intérieur d'untry/catch
bloc. Une chaîne JSON fournie par l'utilisateur pourrait bloquer votre application et même entraîner des failles de sécurité. Assurez-vous que la gestion des erreurs est effectuée si vous analysez le JSON fourni en externe.la source
and could even lead to security holes
par curiosité, comment?<script>...
, et que l'erreur est déversée du côté client, vous avez un bogue XSS juste là. Par conséquent, l'OMI est important de gérer les erreurs JSON là où vous les analysez.require
JSON?" et n'a même pas pris la peine de documenter les effets secondaires. Cela signifiait également que require accepte les fichiers dans deux langues: JavaScript et JSON (non, ce ne sont pas les mêmes). Voilà pour SRP.utilisez l' objet JSON :
la source
Un autre exemple de JSON.parse:
la source
Je voudrais mentionner qu'il existe des alternatives à l'objet JSON global.
JSON.parse
etJSON.stringify
sont tous les deux synchrones, donc si vous voulez traiter de gros objets, vous voudrez peut-être vérifier certains des modules JSON asynchrones.Jetez un œil: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
la source
JSON.parse
l'ensemble de votre application va planter ou, en utilisantprocess.on('uncaughtException', function(err) { ... });
, il n'y aura finalement aucune chance d'envoyer une erreur "JSON mal formé" à l'utilisateur.async
analyseur? Je ne l'ai pas trouvé.Incluez la
node-fs
bibliothèque.Pour plus d'informations sur la bibliothèque 'fs', reportez-vous à la documentation sur http://nodejs.org/api/fs.html
la source
Puisque vous ne savez pas que votre chaîne est réellement valide, je la mettrais d'abord dans un catch catch. De plus, comme les blocs try catch ne sont pas optimisés par nœud, je mettrais le tout dans une autre fonction:
OU en "style asynchrone"
la source
Analyser un flux JSON? Utilisez
JSONStream
.https://github.com/dominictarr/JSONStream
la source
Tout le monde ici a parlé de JSON.parse, alors j'ai pensé à dire autre chose. Il existe un excellent module Se connecter avec de nombreux middleware pour faciliter et améliorer le développement d'applications. L'un des middleware est bodyParser . Il analyse JSON, les formulaires html, etc. Il existe également un middleware spécifique pour l'analyse JSON uniquement noop .
Jetez un œil aux liens ci-dessus, cela pourrait vous être très utile.
la source
C'est tout.
la source
comme d'autres réponses ici l'ont mentionné, vous voudrez probablement exiger un fichier json local que vous savez sûr et présent, comme un fichier de configuration:
ou pour utiliser l'objet JSON global pour analyser une valeur de chaîne dans un objet:
notez que lorsque vous avez besoin d'un fichier, le contenu de ce fichier est évalué, ce qui introduit un risque de sécurité au cas où ce ne serait pas un fichier json mais un fichier js.
ici, j'ai publié une démo où vous pouvez voir les deux méthodes et jouer avec elles en ligne (l'exemple d'analyse est dans le fichier app.js - puis cliquez sur le bouton Exécuter et voyez le résultat dans le terminal): http: // staging1 .codefresh.io / labs / api / env / json-parse-example
vous pouvez modifier le code et voir l'impact ...
la source
Vous utilisez JSON pour votre configuration avec Node.js? Lisez ceci et obtenez vos compétences de configuration sur 9000 ...
Les applications appropriées sont disponibles dans plus de 3 couches de configuration:
La plupart des développeurs traitent leur configuration de serveur et d'application comme si elle pouvait changer. Ça ne peut pas. Vous pouvez superposer les modifications des couches supérieures les unes sur les autres, mais vous modifiez les exigences de base . Certaines choses doivent exister! Faites en sorte que votre configuration agisse comme immuable, car certaines d'entre elles le sont essentiellement, tout comme votre code source.
Ne pas voir que beaucoup de vos choses ne changeront pas après le démarrage conduit à des anti-modèles comme joncher votre chargement de configuration avec des blocs try / catch, et prétendre que vous pouvez continuer sans votre application correctement configurée. Tu ne peux pas. Si vous le pouvez, cela appartient à la couche de configuration communauté / utilisateur, pas à la couche de configuration serveur / application. Vous faites juste mal. Les éléments facultatifs doivent être superposés lorsque l'application termine son amorçage.
Arrêtez de vous cogner la tête contre le mur: votre configuration doit être ultra simple .
Jetez un œil à la facilité de configuration de quelque chose d'aussi complexe qu'un framework de service indépendant du protocole et indépendant de la source de données à l'aide d'un simple fichier de configuration json et d'un simple fichier app.js ...
container-config.js ...
index.js ... (le moteur qui fait tout fonctionner)
app.js ... (le code qui alimente votre service indépendant du protocole et indépendant de la source de données)
En utilisant ce modèle, vous pouvez maintenant charger des éléments de configuration de communauté et d'utilisateur au-dessus de votre application démarrée, dev ops est prêt à placer votre travail dans un conteneur et à le mettre à l'échelle. Vous êtes lu pour plusieurs locataires. Userland est isolé. Vous pouvez maintenant séparer les préoccupations du protocole de service que vous utilisez, du type de base de données que vous utilisez et vous concentrer uniquement sur l'écriture d'un bon code.
Parce que vous utilisez des couches, vous pouvez compter sur une seule source de vérité pour tout, à tout moment (l'objet de configuration en couches), et éviter les vérifications d'erreurs à chaque étape, en vous inquiétant de "oh merde, comment vais-je faire cela travailler sans configuration correcte?!? ".
la source
Ma solution:
la source
TypeError: path must be a string or Buffer
erreurs - une idée par où commencer à déboguer ce problème?Je veux juste compléter la réponse (car j'ai eu du mal avec ça pendant un certain temps), je veux montrer comment accéder aux informations json, cet exemple montre comment accéder à Json Array:
la source
Juste pour rendre cela aussi compliqué que possible, et apporter autant de paquets que possible ...
Cela vous permet de faire:
Ou si vous utilisez async / wait:
L'avantage par rapport à la simple utilisation
readFileSync
est que votre serveur Node peut traiter d'autres requêtes pendant la lecture du fichier sur le disque.la source
JSON.parse n'assurera pas la sécurité de la chaîne json que vous analysez. Vous devriez regarder une bibliothèque comme json-safe-parse ou une bibliothèque similaire.
À partir de la page npm de json-safe-parse:
la source
Tirez parti de la fonction de tentative de Lodash pour renvoyer un objet d'erreur, que vous pouvez gérer avec la fonction isError.
la source
.bind
au lieu d'utiliser simplement _.attempt (JSON.parse, str)Assurez-vous toujours d'utiliser JSON.parse dans le bloc try catch car le nœud renvoie toujours une erreur inattendue si vous avez des données corrompues dans votre json, utilisez donc ce code au lieu du simple JSON.Parse
la source
Si vous souhaitez ajouter des commentaires dans votre JSON et autoriser les virgules de fin, vous pouvez utiliser ci-dessous l'implémentation:
Notez que cela pourrait ne pas bien fonctionner si vous avez quelque chose comme
"abc": "foo // bar"
dans votre JSON. Alors YMMV.la source
Si le fichier source JSON est assez volumineux, vous pouvez envisager la route asynchrone via l'approche asynchrone / attente native avec Node.js 8.0 comme suit
la source
J'utilise fs-extra . Je l'aime beaucoup parce que, même s'il prend en charge les rappels, il prend également en charge les promesses . Cela me permet donc d'écrire mon code d'une manière beaucoup plus lisible:
Il possède également de nombreuses méthodes utiles qui ne sont pas fournies avec le
fs
module standard et , en plus de cela, il relie également les méthodes dufs
module natif et les promet.C'est donc essentiellement tous les avantages. J'espère que d'autres trouveront cela utile.
la source
Si vous devez analyser JSON avec Node.js de manière sécurisée (alias: l'utilisateur peut entrer des données ou une API publique), je suggérerais d'utiliser secure-json-parse .
L'utilisation est similaire à celle par défaut,
JSON.parse
mais elle protégera votre code contre:la source
Vous pouvez utiliser JSON.parse () (qui est une fonction intégrée qui vous forcera probablement à l'envelopper avec des instructions try-catch).
Ou utilisez une bibliothèque npm d'analyse JSON, quelque chose comme json-parse-or
la source
Utilisez ceci pour être du bon côté
la source
NodeJs est un serveur basé sur JavaScript , vous pouvez donc faire comme vous le faites en JavaScript pur ...
Imaginez que vous avez ce Json dans NodeJs ...
Et vous pouvez faire ci-dessus pour obtenir une version analysée de votre json ...
la source
Comme mentionné dans les réponses ci-dessus, nous pouvons utiliser
JSON.parse()
pour analyser les chaînes en JSON Mais avant d'analyser, assurez-vous d'analyser les données correctes, sinon cela pourrait faire baisser votre application entièreil est sûr de l'utiliser comme ça
la source
Utilisez
JSON.parse(str);
. En savoir plus ici .Voici quelques exemples:
la source
Aucun autre module n'est requis.
Utilisez simplement
var parsedObj = JSON.parse(yourObj);
Je ne pense pas qu'il y ait de problème de sécurité
la source
C'est simple, vous pouvez convertir JSON en chaîne en utilisant
JSON.stringify(json_obj)
et convertir la chaîne en JSON en utilisantJSON.parse("your json string")
.la source