我应该如何使用Node.js解析JSON?有没有一些模块可以安全地验证和解析JSON?
我应该如何使用Node.js解析JSON?有没有一些模块可以安全地验证和解析JSON?
JSON.parse
方法。
JSON
对象的定义是 ECMAScript 5 规范的一部分。node.js 是基于 Google Chrome 的V8 引擎构建的,该引擎遵循 ECMA 标准,因此 node.js 也有一个全局对象JSON
[文档]。JSON.parse
是同步方法,可能会阻塞当前线程。因此,如果你要解析大型 JSON 对象,请使用流式 JSON 解析器。你可以使用require方法来加载.json文件。
var parsedJSON = require('./file-name');
例如,如果您在源代码文件所在的同一目录中有一个名为config.json
的文件,您将使用以下内容:
var config = require('./config.json');
或者(文件扩展名可以省略):
var config = require('./config');
请注意require
是同步的,仅会读取文件一次,随后的调用将返回缓存中的结果。
同时请注意,您应仅在绝对控制之下的本地文件中使用此方法,因为它可能执行文件中的任何代码。
require
方法是同步的。如果您需要使用异步方式,请改用 fs.readFile
方法,并在其后使用 JSON.parse
方法。 - Evan Moran你可以使用JSON.parse()
。
你应该能够在任何符合ECMAScript 5标准的JavaScript实现中使用JSON
对象。而V8,它是Node.js构建所基于的之一。
注意:如果你正在使用JSON文件来存储敏感信息(例如密码),那么这样做是错误的。查看Heroku如何处理:https://devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application。了解你的平台如何处理,并使用
process.env
从代码内检索配置变量。
var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);
您需要使用fs
模块进行一些文件操作。
var fs = require('fs');
fs.readFile('/path/to/file.json', 'utf8', function (err, data) {
if (err) throw err; // we'll not consider error handling for now
var obj = JSON.parse(data);
});
var fs = require('fs');
var json = JSON.parse(fs.readFileSync('/path/to/file.json', 'utf8'));
require
吗?再三考虑!var obj = require('path/to/file.json');
但是,出于几个原因,我不建议这样做:
require
是同步的。如果你有一个非常大的 JSON 文件,它会阻塞你的事件循环。你真的需要使用 JSON.parse
和 fs.readFile
。require
只会读取文件一次。对于相同文件的后续调用,require
将返回一个缓存的副本。如果你想读取一个不断更新的 .json
文件,这不是一个好主意。你可以使用hack。但现在,最简单的方法是使用 fs
。.json
扩展名,require
将不把文件内容视为 JSON。认真点!使用 JSON.parse
。
load-json-file
模块如果你正在读取大量的 .json
文件(并且如果你非常懒),每次编写样板代码都会变得很烦人。你可以使用load-json-file
模块来节省一些字符。
const loadJsonFile = require('load-json-file');
loadJsonFile('/path/to/file.json').then(json => {
// `json` contains the parsed object
});
let obj = loadJsonFile.sync('/path/to/file.json');
如果JSON内容在网络上以流的形式传输,需要使用流式 JSON 解析器。否则它会占用处理器并阻塞事件循环,直到JSON内容完全传输。
在NPM中有许多可用的软件包可供选择,选择最适合您的软件包。
如果不确定传递给JSON.parse()
的内容是否是有效的JSON,请务必将对JSON.parse()
的调用放置在try/catch
块中。用户提供的JSON字符串可能会导致应用程序崩溃,甚至可能导致安全漏洞。确保在解析外部提供的JSON时进行错误处理。
<script>...</script>
文本,并且错误被泄露到客户端,那么就会出现 XSS 漏洞。因此,在解析 JSON 数据时及时处理错误非常重要。 - sampathsrisrequire
包含JSON会很酷”,甚至没有费心记录副作用。这也意味着require
接受两种语言的文件:JavaScript和JSON(它们不同)。SRP就这样了。 - sampathsris使用JSON对象:
JSON.parse(str);
JSON.parse 的另一个示例:
var fs = require('fs');
var file = __dirname + '/config.json';
fs.readFile(file, 'utf8', function (err, data) {
if (err) {
console.log('Error: ' + err);
return;
}
data = JSON.parse(data);
console.dir(data);
});
我想提到,全局JSON对象有一些替代品。
JSON.parse
和JSON.stringify
都是同步的,所以如果你想处理大型对象,可能需要查看一些异步的JSON模块。
请看这里:https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
JSON.parse
解析到格式不正确的JSON数据,整个应用程序将会崩溃;或者使用process.on('uncaughtException', function(err) { ... });
,最终将无法向用户发送“格式不正确的JSON”错误信息。 - Paul引入node-fs
库。
var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));
要了解更多关于 'fs' 库的信息,请参考http://nodejs.org/api/fs.html上的文档。
既然您不知道您的字符串是否有效,我建议您首先放入try catch中。另外,由于node不会对try catch块进行优化,我建议您将整个操作放入另一个函数中:
function tryParseJson(str) {
try {
return JSON.parse(str);
} catch (ex) {
return null;
}
}
"异步样式"中的OR
function tryParseJson(str, callback) {
process.nextTick(function () {
try {
callback(null, JSON.parse(str));
} catch (ex) {
callback(ex)
}
})
}
JSONStream
。var request = require('request')
, JSONStream = require('JSONStream')
request({url: 'http://isaacs.couchone.com/registry/_all_docs'})
.pipe(JSONStream.parse('rows.*'))
.pipe(es.mapSync(function (data) {
return data
}))
JSON.parse("your string");
就这些。