协慌网

登录 贡献 社区

如何使用 Node.js 解析 JSON?

我应该如何使用 Node.js 解析 JSON?是否有一些模块可以安全地验证和解析 JSON?

答案

您只需使用JSON.parse

JSON对象的定义是 ECMAScript 5 规范的一部分 。 node.js 建立在谷歌 Chrome 的V8引擎上,符合 ECMA 标准。因此,node.js 还有一个全局对象JSON [docs]

注 - JSON.parse可以绑定当前线程,因为它是一个同步方法。因此,如果您计划解析大型 JSON 对象,请使用流式 json 解析器。

你可以要求 .json 文件。

var parsedJSON = require('./file-name');

例如,如果您在源代码文件所在的目录中有config.json文件,则可以使用:

var config = require('./config.json');

或(文件扩展名可以省略):

var config = require('./config');

请注意, require同步的 ,只读取文件一次 ,后面的调用返回缓存中的结果

另请注意,您应该仅在绝对控制下将其用于本地文件,因为它可能会执行文件中的任何代码。

您可以使用JSON.parse()

您应该能够在任何兼容ECMAScript 5 的 JavaScript 实现上使用JSON对象。构建 Node.js 的V8就是其中之一。

注意:如果您使用 JSON 文件来存储敏感信息(例如密码),那么这是错误的方法。了解 Heroku 如何做到这一点: https//devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application 。了解您的平台如何做到这一点,并使用process.env从代码中检索配置变量。


解析包含 JSON 数据的字符串

var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);

解析包含 JSON 数据的文件

您将不得不使用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吗?再想想!

您有时可以使用require

var obj = require('path/to/file.json');

但是,我不建议这样做有几个原因:

  1. require是同步的。如果你有一个非常大的 JSON 文件,它会阻塞你的事件循环。你真的需要在fs.readFile使用JSON.parse
  2. require只会读取一次文件。后续调用require为同一个文件会返回一个缓存副本。如果您想要读取不断更新的.json文件,这不是一个好主意。你可以使用黑客攻击 。但在这一点上,简单地使用fs更容易。
  3. 如果您的文件没有.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 解析器。否则它将占用您的处理器并阻塞您的事件循环,直到 JSON 内容完全流式传输。

NPM 中很多可用的包 。选择最适合您的方式。


错误处理 / 安全性

如果您不确定传递给JSON.parse()是否是有效的 JSON ,请确保在try/catch块中包含对JSON.parse()的调用。用户提供的 JSON 字符串可能会导致应用程序崩溃,甚至可能导致安全漏洞。如果解析外部提供的 JSON,请确保完成错误处理。