Wie soll ich JSON mit Node.js analysieren? Gibt es ein Modul, das JSON sicher validiert und analysiert?
javascript
json
node.js
Tikhon Jelvis
quelle
quelle
Sie können .json-Dateien benötigen .
Wenn Sie beispielsweise eine
config.json
Datei im selben Verzeichnis wie Ihre Quellcodedatei haben, würden Sie Folgendes verwenden:oder (Dateierweiterung kann weggelassen werden):
Beachten Sie, dass
require
ist synchron und liest die Datei nur einmal , kehrt nach einer Aufforderung das Ergebnis aus dem CacheBeachten Sie auch, dass Sie dies nur für lokale Dateien verwenden sollten, die Ihrer absoluten Kontrolle unterliegen, da möglicherweise Code in der Datei ausgeführt wird.
quelle
require
synchron ist. Wenn Siefs.readFile
stattdessen eine freundliche Verwendung mitJSON.parse
.json
Erweiterung zu verwenden! Wenn Ihre Datei NICHT die.json
Erweiterung hat, wird sie von require nicht als JSON-Datei behandelt.Sie können verwenden
JSON.parse()
.Sie sollten in der Lage sein, das
JSON
Objekt in jeder ECMAScript 5- kompatiblen JavaScript-Implementierung zu verwenden. Und V8 , auf dem Node.js basiert, ist einer von ihnen.Analysieren einer Zeichenfolge mit JSON-Daten
Analysieren einer Datei mit JSON-Daten
Sie müssen einige Dateivorgänge mit dem
fs
Modul ausführen .Asynchrone Version
Synchrone Version
Willst du benutzen
require
? Denk nochmal!Sie können manchmal verwenden
require
:Ich empfehle dies jedoch aus mehreren Gründen nicht:
require
ist synchron. Wenn Sie eine sehr große JSON-Datei haben, wird Ihre Ereignisschleife erstickt. Sie müssen wirklich verwendenJSON.parse
mitfs.readFile
.require
liest die Datei nur einmal . Nachfolgende Aufruferequire
derselben Datei geben eine zwischengespeicherte Kopie zurück. Keine gute Idee, wenn Sie eine.json
Datei lesen möchten, die ständig aktualisiert wird. Sie könnten einen Hack gebrauchen . Aber an diesem Punkt ist es einfacher, einfach zu verwendenfs
..json
Erweiterung hat,require
wird der Inhalt der Datei nicht als JSON behandelt.Ernsthaft! Verwenden Sie
JSON.parse
.load-json-file
ModulWenn Sie eine große Anzahl von
.json
Dateien lesen (und wenn Sie extrem faul sind), wird es ärgerlich, jedes Mal Boilerplate-Code zu schreiben. Sie können einige Zeichen mithilfe desload-json-file
Moduls speichern .Asynchrone Version
Synchrone Version
Analysieren von JSON aus Streams
Wenn der JSON-Inhalt über das Netzwerk gestreamt wird, müssen Sie einen Streaming-JSON-Parser verwenden. Andernfalls wird Ihr Prozessor gebunden und Ihre Ereignisschleife gedrosselt, bis der JSON-Inhalt vollständig gestreamt ist.
Dafür gibt es in NPM viele Pakete . Wählen Sie, was für Sie am besten ist.
Fehlerbehandlung / Sicherheit
Wenn Sie nicht sicher sind, ob das, an das übergeben
JSON.parse()
wird, gültiges JSON ist , stellen Sie sicher, dass der Aufruf inJSON.parse()
einemtry/catch
Block eingeschlossen ist. Eine vom Benutzer bereitgestellte JSON-Zeichenfolge kann Ihre Anwendung zum Absturz bringen und sogar zu Sicherheitslücken führen. Stellen Sie sicher, dass die Fehlerbehandlung durchgeführt wird, wenn Sie extern bereitgestelltes JSON analysieren.quelle
and could even lead to security holes
aus Neugier, wie?<script>...
und der Fehler auf die Clientseite übertragen wurde, liegt genau dort ein XSS-Fehler vor. Daher ist es IMO wichtig, JSON-Fehler genau dort zu behandeln, wo Sie sie analysieren.require
JSON einzuschließen?" und machte sich nicht einmal die Mühe, die Nebenwirkungen zu dokumentieren. Dies bedeutete auch, dass require Dateien in zwei Sprachen akzeptiert: JavaScript und JSON (nein, sie sind nicht gleich). Soviel zu SRP.Verwenden Sie das JSON-Objekt :
quelle
Ein weiteres Beispiel für JSON.parse:
quelle
Ich möchte erwähnen, dass es Alternativen zum globalen JSON-Objekt gibt.
JSON.parse
undJSON.stringify
sind beide synchron. Wenn Sie also mit großen Objekten arbeiten möchten, sollten Sie einige der asynchronen JSON-Module ausprobieren.Schauen Sie mal rein : https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
quelle
JSON.parse
Ihrer gesamten Anwendung analysiert wird, stürzt es ab oderprocess.on('uncaughtException', function(err) { ... });
es besteht möglicherweise keine Möglichkeit, einen "fehlerhaften JSON" -Fehler an den Benutzer zu senden.async
Parser? Ich habe es nicht gefunden.Schließen Sie die
node-fs
Bibliothek ein.Weitere Informationen zur 'fs'-Bibliothek finden Sie in der Dokumentation unter http://nodejs.org/api/fs.html
quelle
Da Sie nicht wissen, dass Ihre Zeichenfolge tatsächlich gültig ist, würde ich sie zuerst in einen Try-Catch einfügen. Da try catch-Blöcke nicht vom Knoten optimiert werden, würde ich das Ganze in eine andere Funktion einfügen:
ODER im "asynchronen Stil"
quelle
JSON-Stream analysieren? Verwenden Sie
JSONStream
.https://github.com/dominictarr/JSONStream
quelle
Jeder hier hat von JSON.parse erzählt, also dachte ich daran, etwas anderes zu sagen. Es gibt ein großartiges Modul. Verbinden Sie sich mit vielen Middleware, um die Entwicklung von Apps einfacher und besser zu machen. Eine der Middleware ist bodyParser . Es analysiert JSON, HTML-Formulare usw. Es gibt auch eine spezielle Middleware für JSON, die nur Noop analysiert .
Schauen Sie sich die obigen Links an, es könnte für Sie sehr hilfreich sein.
quelle
Das ist alles.
quelle
Wie in anderen Antworten bereits erwähnt, möchten Sie wahrscheinlich entweder eine lokale JSON-Datei benötigen, von der Sie wissen, dass sie sicher und vorhanden ist, z. B. eine Konfigurationsdatei:
oder um das globale JSON-Objekt zu verwenden, um einen Zeichenfolgenwert in ein Objekt zu analysieren:
Beachten Sie, dass, wenn Sie eine Datei benötigen, der Inhalt dieser Datei ausgewertet wird, was ein Sicherheitsrisiko darstellt, falls es sich nicht um eine JSON-Datei, sondern um eine JS-Datei handelt.
Hier habe ich eine Demo veröffentlicht, in der Sie beide Methoden sehen und online damit spielen können (das Analysebeispiel befindet sich in der Datei app.js - klicken Sie dann auf die Schaltfläche Ausführen und sehen Sie das Ergebnis im Terminal): http: // staging1 .codefresh.io / labs / api / env / json-parse-Beispiel
Sie können den Code ändern und die Auswirkungen sehen ...
quelle
Verwenden Sie JSON für Ihre Konfiguration mit Node.js? Lesen Sie dies und erwerben Sie Ihre Konfigurationsfähigkeiten über 9000 ...
Proper - Anwendungen kommen in 3 + Schichten der Konfiguration:
Die meisten Entwickler behandeln ihre Server- und App-Konfiguration so, als ob sie sich ändern könnte. Es kann nicht. Sie können Änderungen von höheren Ebenen übereinander legen, aber Sie ändern die Basisanforderungen . Einige Dinge müssen existieren! Stellen Sie sicher, dass Ihre Konfiguration unveränderlich ist, da ein Teil davon im Grunde genau wie Ihr Quellcode ist.
Wenn Sie nicht sehen, dass sich viele Ihrer Inhalte nach dem Start nicht ändern, führt dies zu Anti-Patterns wie dem Verunreinigen Ihrer Konfiguration mit Try / Catch-Blöcken und dem Vorgeben, dass Sie ohne Ihre ordnungsgemäß eingerichtete Anwendung fortfahren können. Das kannst du nicht. Wenn Sie können, gehört dies zur Community- / Benutzerkonfigurationsebene und nicht zur Server- / App-Konfigurationsebene. Du machst es einfach falsch. Das optionale Material sollte überlagert werden, wenn die Anwendung den Bootstrap beendet hat.
Hör auf, deinen Kopf gegen die Wand zu schlagen: Deine Konfiguration sollte extrem einfach sein .
Sehen Sie sich an, wie einfach es ist, mit einer einfachen json-Konfigurationsdatei und einer einfachen app.js-Datei etwas so Komplexes wie ein protokollunabhängiges und datenquellenunabhängiges Service-Framework einzurichten ...
container-config.js ...
index.js ... (die Engine, die alles antreibt )
app.js ... (der Code, der Ihren protokollunabhängigen und datenquellenunabhängigen Dienst unterstützt)
Mit diesem Muster können Sie jetzt Community- und Benutzerkonfigurationsdaten auf Ihre gebootete App laden. Dev ops ist bereit, Ihre Arbeit in einen Container zu schieben und zu skalieren. Sie sind für Multitenant gelesen. Userland ist isoliert. Sie können jetzt die Bedenken hinsichtlich des von Ihnen verwendeten Dienstprotokolls, des von Ihnen verwendeten Datenbanktyps trennen und sich nur darauf konzentrieren, guten Code zu schreiben.
Weil Sie Schichten verwenden, können Sie auf einer einzigen Quelle der Wahrheit vertrauen für alles, jederzeit (das geschichtete Config - Objekt), und vermeiden Sie Fehlerprüfungen bei jedem Schritt, sich Gedanken über „oh Mist, wie werde ich machen diese ohne richtige Konfiguration arbeiten?!? ".
quelle
Meine Lösung:
quelle
TypeError: path must be a string or Buffer
Fehler angezeigt. Haben Sie eine Idee, wo Sie mit dem Debuggen dieses Problems beginnen sollen?Ich möchte nur die Antwort vervollständigen (da ich eine Weile damit zu kämpfen hatte), möchte zeigen, wie man auf die JSON-Informationen zugreift. Dieses Beispiel zeigt den Zugriff auf das Json-Array:
quelle
Nur um dies so kompliziert wie möglich zu gestalten und so viele Pakete wie möglich einzubringen ...
So können Sie:
Oder wenn Sie async / await verwenden:
Der Vorteil gegenüber der bloßen Verwendung
readFileSync
besteht darin, dass Ihr Knotenserver andere Anforderungen verarbeiten kann, während die Datei von der Festplatte gelesen wird.quelle
JSON.parse gewährleistet nicht die Sicherheit der von Ihnen analysierten JSON-Zeichenfolge. Sie sollten sich eine Bibliothek wie json-safe-parse oder eine ähnliche Bibliothek ansehen .
Von der json-safe-parse npm-Seite:
quelle
Nutzen Sie die Versuchsfunktion von Lodash, um ein Fehlerobjekt zurückzugeben, das Sie mit der Funktion isError verarbeiten können.
quelle
.bind
anstatt nur _.attempt (JSON.parse, str) zu verwendenStellen Sie immer sicher, dass Sie JSON.parse im try catch- Block verwenden, da der Knoten immer einen unerwarteten Fehler auslöst, wenn Ihr json beschädigte Daten enthält. Verwenden Sie daher diesen Code anstelle von einfachem JSON.Parse
quelle
Wenn Sie Ihrem JSON einige Kommentare hinzufügen und nachfolgende Kommas zulassen möchten, sollten Sie die folgende Implementierung verwenden:
Beachten Sie, dass es möglicherweise nicht gut funktioniert, wenn Sie etwas wie
"abc": "foo // bar"
in Ihrem JSON haben. Also YMMV.quelle
Wenn die JSON-Quelldatei ziemlich groß ist, sollten Sie die asynchrone Route über den nativen asynchronen / wartenden Ansatz mit Node.js 8.0 wie folgt berücksichtigen
quelle
Ich benutze fs-extra . Ich mag es sehr, weil es - obwohl es Rückrufe unterstützt - auch Versprechen unterstützt . So kann ich meinen Code viel besser lesbar schreiben:
Es hat auch viele nützliche Methoden , die mit dem Standard nicht mitzukommen
fs
Modul und auf Hinzu kommt , dass es auch die Methoden aus dem nativen Brücken -fs
Modul und promisifies sie.Es sind also im Grunde alle Vorteile. Ich hoffe, andere finden das nützlich.
quelle
Wenn Sie JSON mit Node.js auf sichere Weise analysieren müssen (auch bekannt als: Der Benutzer kann Daten oder eine öffentliche API eingeben), würde ich die Verwendung von Secure-JSON-Parse empfehlen .
Die Verwendung entspricht der Standardeinstellung
JSON.parse
, schützt Ihren Code jedoch vor:quelle
Sie können JSON.parse () verwenden (eine integrierte Funktion, die Sie wahrscheinlich dazu zwingen wird, sie mit try-catch-Anweisungen zu versehen).
Oder verwenden Sie eine JSON-Parsing-npm-Bibliothek, z. B. json-parse-or
quelle
Verwenden Sie dies, um auf der sicheren Seite zu sein
quelle
NodeJs ist ein JavaScript- basierter Server. Sie können dies also in reinem JavaScript tun ...
Stellen Sie sich vor, Sie haben diesen Json in NodeJs ...
Und Sie können oben tun, um eine analysierte Version Ihres json zu erhalten ...
quelle
Wie in den obigen Antworten erwähnt, können wir
JSON.parse()
die Zeichenfolgen in JSON analysieren. Stellen Sie jedoch vor dem Parsen sicher, dass Sie die richtigen Daten analysieren, da sonst Ihre gesamte Anwendung heruntergefahren werden kannes ist sicher, es so zu benutzen
quelle
Verwenden Sie
JSON.parse(str);
. Lesen Sie hier mehr darüber .Hier sind einige Beispiele:
quelle
Es müssen keine weiteren Module benötigt werden.
Verwenden Sie einfach
var parsedObj = JSON.parse(yourObj);
Ich glaube nicht, dass es diesbezüglich Sicherheitsprobleme gibt
quelle
Es ist ganz einfach: Sie können JSON mithilfe von Zeichenfolgen in Zeichenfolgen konvertieren und Zeichenfolgen mithilfe
JSON.stringify(json_obj)
von JSON konvertierenJSON.parse("your json string")
.quelle