如何使用 Node.js 解析 JSON?

IT技术 javascript json node.js
2021-01-31 04:49:03

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

6个回答

您可以简单地使用JSON.parse.

JSON对象的定义是 ECMAScript 5 规范的一部分node.js 建立在 Google Chrome 的V8引擎之上,它遵循 ECMA 标准。因此,node.js 也有一个全局对象[docs]JSON

注意 -JSON.parse可以占用当前线程,因为它是一种同步方法。因此,如果您打算解析大型 JSON 对象,请使用流式 json 解析器。

您的答案需要 JavaScript 语法的先验知识。展示一个使用示例有多难?JSON.parse(str); // 是 noob-friendly 因此更好的答案
2021-03-12 04:49:03
@snapfractalpop:文档只描述了node.js 中的函数等。标准 JavaScript 功能是V8 的一部分,node.js 是建立在它的基础上的。我相应地更新了答案。
2021-03-22 04:49:03
在这里,我发布了一个演示,您可以在其中在线查看和使用此答案(解析示例在 app.js 文件中 - 然后单击运行按钮并在终端中查看结果):链接 您可以修改代码并看到影响...
2021-03-22 04:49:03
有谁知道为什么这不在官方文档中?或者,如果有,在哪里可以找到?
2021-03-26 04:49:03
@FelixKling 对于它的value,node 的 github wiki 上有很多东西:github.com/joyent/node/wiki/...
2021-04-09 04:49:03

你可以要求.json 文件。

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

例如,如果您config.json在源代码文件所在的目录中有一个文件,您将使用:

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

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

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

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

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

简单说明:不要忘记使用.json扩展!如果您的文件没有.json扩展名,require 不会将其视为 json 文件。
2021-03-23 04:49:03
还要注意这require是同步的。如果你想异步友好地使用fs.readFile而不是JSON.parse
2021-03-24 04:49:03
请注意,响应已缓存。例如,如果您将上面的 require 调用放在函数中,调用该函数,更改 JSON 文件,然后再次调用该函数,您将获得版本的 JSON 文件。已经把我抓到了几次!
2021-03-30 04:49:03
这种方法是否只是将文件视为 JavaScript,从而可能在 .json 文件中运行任意代码?
2021-04-08 04:49:03
如果您使用此方法解析文件,请确保将路径考虑在内。例如,您可能需要执行以下操作:require './file-name-with-no-extension'(例如,如果文件在当前目录中)
2021-04-09 04:49:03

您可以使用JSON.parse().

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

注意:如果您使用 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 数据的文件

您必须对fsmodule进行一些文件操作

异步版本

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 文件,它会阻塞您的事件循环。你真的需要使用JSON.parsewith fs.readFile
  2. require读取文件一次require对同一文件的后续调用将返回缓存副本。如果您想读取.json不断更新文件,这不是一个好主意你可以使用hack但在这一点上,简单地使用fs.
  3. 如果您的文件没有.json扩展名,require则不会将文件内容视为 JSON。

严重地!使用JSON.parse.


load-json-file module

如果您正在阅读大量.json文件(并且如果您非常懒惰),则每次编写样板代码都会变得很烦人。您可以使用该load-json-filemodule保存一些字符

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,请确保调用封装到JSON.parse()一个内部try/catch块。用户提供的 JSON 字符串可能会使您的应用程序崩溃,甚至可能导致安全漏洞。如果您解析外部提供的 JSON,请确保已完成错误处理。

@natario:我们在这里谈论的是服务器端 JS。假设有人正在解析用户提供的 JSON。如果假设 JSON 总是格式良好,则攻击者可以发送一些格式错误的 JSON 来触发错误,如果错误泄露到客户端,可能会泄露有关系统的重要信息。或者,如果 JSON 格式错误并且包含一些带有 的文本<script>...,并且错误会溢出到客户端,那么您就存在 XSS 错误。因此,IMO 在解析它的地方处理 JSON 错误很重要。
2021-03-15 04:49:03
@NickSteele:是的,仅适用于配置它工作正常。但是 JSON 不仅仅用于配置。
2021-03-21 04:49:03
@NickSteele:鉴于我列出的缺陷,我认为这不是一个设计良好的功能。在我看来,有些人认为“嘿,使用require包含 JSON不是很酷吗?” 甚至没有费心记录副作用。这也意味着 require 接受两种语言的文件:JavaScript 和 JSON(不,它们不一样)。SRP 就这么多。
2021-03-30 04:49:03
@NickSteele:但是,我将“不推荐”更改为“我不推荐”。我希望你现在快乐。
2021-04-06 04:49:03
and could even lead to security holes 出于好奇,如何?
2021-04-08 04:49:03

使用JSON 对象

JSON.parse(str);
我个人觉得这一系列评论相当有趣,但答案本身就是在浪费我的时间。...我不确定这是否意味着应该删除答案,因为那样我就不会看到评论线程。但否则我会说是的。
2021-03-17 04:49:03
这个答案有 50 个赞。根据1% 规则,大概有 5000 个用户花时间阅读了这个答案,这与排名靠前的没有任何关系。它已经使用了 3 年,这一事实只会让问题变得更糟:)
2021-03-26 04:49:03
@DanDascalescu,我相信这个答案更清楚、更直接。接受的一个没有给出使用示例,并且由于许多链接和额外的东西而令人困惑。
2021-03-26 04:49:03
这只是复制了最佳答案。请考虑删除它;你会保留积分。
2021-03-29 04:49:03
@DanDascalescu——如果您注意到的话,这两个答案是在 3 年前完全相同的时间发布的。它们都提供相同的信息。整个SO都是这种情况,我不会仅仅因为它们不是公认的答案就剔除我的一半答案。
2021-04-06 04:49:03

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 文件是应用程序的本地文件。谢谢!
2021-03-15 04:49:03