Wie sollte ich JSON mit Node.js parsen? Gibt es ein Modul, das JSON sicher validieren und parsen kann?
Antworten
Zu viele Anzeigen?JSON.parse gewährleistet nicht die Sicherheit des zu analysierenden JSON-Strings. Sie sollten sich eine Bibliothek wie json-safe-parse oder eine ähnliche Bibliothek.
Von json-safe-parse npm Seite:
JSON.parse ist großartig, hat aber im Kontext von JavaScript einen schwerwiegenden Fehler: Es erlaubt Ihnen, geerbte Eigenschaften zu überschreiben. Dies kann zu einem Problem werden, wenn Sie JSON aus einer nicht vertrauenswürdigen Quelle (z. B. einem Benutzer) parsen und Funktionen aufrufen, von denen Sie erwarten würden, dass sie existieren.
Utilice JSON.parse(str);
. Mehr darüber lesen aquí .
Hier sind einige Beispiele:
var jsonStr = '{"result":true, "count":42}';
obj = JSON.parse(jsonStr);
console.log(obj.count); // expected output: 42
console.log(obj.result); // expected output: true
Ich benutze fs-extra . Ich mag es sehr, denn obwohl es Rückrufe unterstützt, unterstützt es auch Versprechen . So kann ich meinen Code viel lesbarer schreiben:
const fs = require('fs-extra');
fs.readJson("path/to/foo.json").then(obj => {
//Do dome stuff with obj
})
.catch(err => {
console.error(err);
});
Außerdem verfügt es über viele nützliche Methoden, die nicht zum Standardumfang gehören fs
Modul et Darüber hinaus überbrückt es auch die Methoden der nativen fs
Modul und verspricht sie.
HINWEIS: Sie können weiterhin die nativen Node.js-Methoden verwenden. Sie sind promisifiziert und in fs-extra kopiert. Siehe Hinweise zu
fs.read()
&fs.write()
Es gibt also im Grunde nur Vorteile. Ich hoffe, andere finden das nützlich.
Wenn Sie einige Kommentare in Ihr JSON einfügen und abschließende Kommas zulassen möchten, sollten Sie die folgende Implementierung verwenden:
var fs = require('fs');
var data = parseJsData('./message.json');
console.log('[INFO] data:', data);
function parseJsData(filename) {
var json = fs.readFileSync(filename, 'utf8')
.replace(/\s*\/\/.+/g, '')
.replace(/,(\s*\})/g, '}')
;
return JSON.parse(json);
}
Beachten Sie, dass es möglicherweise nicht gut funktioniert, wenn Sie etwas haben wie "abc": "foo // bar"
in Ihrem JSON. Also YMMV.
Wenn die JSON-Quelldatei ziemlich groß ist, sollten Sie den asynchronen Weg über den nativen async / await-Ansatz mit Node.js 8.0 wie folgt in Betracht ziehen
const fs = require('fs')
const fsReadFile = (fileName) => {
fileName = `${__dirname}/${fileName}`
return new Promise((resolve, reject) => {
fs.readFile(fileName, 'utf8', (error, data) => {
if (!error && data) {
resolve(data)
} else {
reject(error);
}
});
})
}
async function parseJSON(fileName) {
try {
return JSON.parse(await fsReadFile(fileName));
} catch (err) {
return { Error: `Something has gone wrong: ${err}` };
}
}
parseJSON('veryBigFile.json')
.then(res => console.log(res))
.catch(err => console.log(err))