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'));
没有看到很多你的东西在启动后不会改变导致反模式,比如乱丢你的配置加载try / catch块,并且假装你可以继续 without 你正确设置的应用程序 . 你可以't. If you can, that belongs in the community/user config layer, not the server/app config layer. You'只是做错了 . 当应用程序完成引导程序时,可选的东西应该在顶部分层 .
var config = require('./container-config.json'); // Get our service configuration.
var data = require(config.data.type); // Load our data source plugin ('npm install mysql' for mysql).
var service = require(config.service.type); // Load our service plugin ('http' is built-in to node).
var processor = require('./app.js'); // Load our processor (the code you write).
var connection = data.createConnection({ host: config.data.host, user: config.data.user, password: config.data.pass, database: config.data.name });
var server = service.createServer(processor);
connection.connect();
server.listen(config.service.port, function() { console.log("%s service listening on port %s", config.service.type, config.service.port); });
app.js... (为协议无关和数据源不可知服务提供支持的代码)
module.exports = function(request, response){
response.end('Responding to: ' + request.url);
}
30 回答
正如这里提到的其他答案,你可能想要需要一个你知道安全且存在的本地json文件,如配置文件:
或者使用全局JSON对象将字符串值解析为对象:
请注意,当您需要文件时,将评估该文件的内容,如果它不是json文件而是js文件,则会带来安全风险 .
在这里,我发布了一个演示,你可以看到这两种方法并在线玩它们(解析示例在app.js文件中 - 然后单击运行按钮并在终端中查看结果):http://staging1.codefresh.io/labs/api/env/json-parse-example
你可以修改代码并看到影响......
你可以简单地使用JSON.parse .
JSON
对象is part of the ECMAScript 5 specification的定义 . node.js Build 在谷歌Chrome的V8引擎上,符合ECMA标准 . 因此,node.js还有一个全局对象JSON[docs] .注 - JSON.parse可以占用当前线程,因为它是一种同步方法 . 因此,如果您计划解析大型JSON对象,请使用流式json解析器 .
你可以require .json文件 .
例如,如果您在源代码文件所在的目录中有
config.json
文件,则可以使用:或(文件扩展名可以省略):
请注意
require
是 synchronous 并且只读取文件 once ,以下调用从缓存返回结果另请注意,您应该仅在绝对控制下将其用于本地文件,因为它可能会执行文件中的任何代码 .
You can use JSON.parse() .
您应该能够在任何兼容_1611873的JavaScript实现上使用
JSON
对象 . 构建Node.js的V8就是其中之一 .解析包含JSON数据的字符串
解析包含JSON数据的文件
您必须使用
fs
模块执行一些文件操作 .异步版本
同步版本
你想使用require吗?再想想!
You can sometimes use require:
但是,我不建议这样做有几个原因:
require
是同步的 . 如果你有一个非常大的JSON文件,它会阻塞你的事件循环 . 你真的需要使用JSON.parse
和fs.readFile
.require
将读取文件 only once . 对同一文件的require
的后续调用将返回缓存副本 . 如果您想要阅读不断更新的.json
文件,这不是一个好主意 . 你可以使用a hack . 但在这一点上,简单地使用fs
更容易 .如果您的文件没有
.json
扩展名,require
将不会将该文件的内容视为JSON .Seriously! Use JSON.parse .
load-json-file模块
如果你正在阅读大量的
.json
文件,(如果你非常懒惰的话),每次编写样板代码都会很烦人 . 您可以使用load-json-file模块保存一些字符 .异步版本
同步版本
从流中解析JSON
如果JSON内容通过网络流式传输,则需要使用流式JSON解析器 . 否则它将占用您的处理器并阻塞您的事件循环,直到JSON内容完全流式传输 .
这有plenty of packages available in NPM . 选择最适合您的方式 .
错误处理/安全性
如果您不确定传递给
JSON.parse()
的内容是否为valid JSON,请确保将JSON.parse()
的调用封闭在try/catch
块中 . 用户提供的JSON字符串可能会导致应用程序崩溃,甚至可能导致安全漏洞 . 如果解析外部提供的JSON,请确保完成错误处理 .使用JSON object:
JSON.parse的另一个例子:
我想提一下全局JSON对象的替代品 .
JSON.parse
和JSON.stringify
都是同步的,因此如果要处理大对象,可能需要查看一些异步JSON模块 .看看:https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
包括
node-fs
库 .有关'fs'库的更多信息,请参阅http://nodejs.org/api/fs.html上的文档
既然你不知道你的字符串实际上是有效的,我会把它放在try catch中 . 此外,由于try catch块没有被节点优化,我会把整个东西放到另一个函数中:
或“异步风格”
解析JSON流?使用
JSONStream
.https://github.com/dominictarr/JSONStream
就这样 .
这里的每个人都讲过JSON.parse,所以我想说点别的 . 有一个很棒的模块Connect有很多中间件可以让应用程序的开发变得更容易和更好 . 其中一个中间件是bodyParser . 它解析JSON,html表单等 . 还有一个特定的JSON解析中间件noop .
看看上面的链接,它可能对你很有帮助 .
我的解决方案
只是为了让它尽可能复杂,并尽可能多地引入包...
这可以让你做到:
或者,如果您使用async / await:
与仅使用
readFileSync
相比,优点是您的节点服务器可以在从磁盘读取文件时处理其他请求 .只想完成答案(因为我挣扎了一段时间),想要展示如何访问json信息,这个例子显示访问Json数组:
Using JSON for your configuration with Node.js? Read this and get your configuration skills over 9000...
正确的应用程序有3: layers 的配置:
服务器/容器配置
应用程序配置
(可选)租户/社区/组织配置
用户配置
大多数开发人员将其服务器和应用程序配置视为可以更改 . 它不能 . 您可以将更高层的更改层叠在一起,但是您正在修改基本要求 . 有些事情需要存在!让你的配置表现得像它是不可变的,因为它的一些基本上就像你的源代码一样 .
没有看到很多你的东西在启动后不会改变导致反模式,比如乱丢你的配置加载try / catch块,并且假装你可以继续 without 你正确设置的应用程序 . 你可以't. If you can, that belongs in the community/user config layer, not the server/app config layer. You'只是做错了 . 当应用程序完成引导程序时,可选的东西应该在顶部分层 .
不要把头撞在墙上:你的配置应该是 ultra simple .
看一下使用简单的json配置文件和简单的app.js文件设置与协议无关和数据源无关的服务框架这样复杂的东西是多么容易......
container-config.js...
index.js... (为一切提供动力的引擎)
app.js... (为协议无关和数据源不可知服务提供支持的代码)
使用此模式,您现在可以在启动的应用程序之上加载社区和用户配置内容,dev ops已准备好将您的工作推送到容器中并进行扩展 . 你读过多租户 . Userland是孤立的 . 您现在可以分离您正在使用的服务协议的关注点,您正在使用的数据库类型,并专注于编写好的代码 .
因为你正在使用图层,所以你可以随时依赖单一事实来源(分层配置对象),并避免每一步都进行错误检查,担心“哦废话,我怎么做这个没有正确配置的工作?!?“ .
如果您想在JSON中添加一些注释并允许使用尾随逗号,您可能需要在下面的实现中使用:
请注意,如果您的JSON中有
"abc": "foo // bar"
之类的内容,它可能无法正常工作 . 所以YMMV .JSON.parse不会确保您正在解析的json字符串的安全性 . 您应该查看像json-safe-parse这样的库或类似的库 .
从json-safe-parse npm页面:
利用Lodash的尝试函数返回一个错误对象,您可以使用isError函数处理该错误对象 .
始终确保在 try catch 块中使用JSON.parse,因为如果json中有一些损坏的数据,节点总是会抛出一个意外错误,所以请使用此代码而不是简单的JSON.Parse
如果JSON源文件非常大,可能需要通过Native.js 8.0的native async / await方法考虑异步路由,如下所示
这不得不对我大喊:它只适用于
.json
文件 .如果文件结尾不同,这不起作用!
您可以使用JSON.parse()(这是一个内置函数,可能会强制您使用try-catch语句包装它) .
或者使用一些JSON解析npm库,类似json-parse-or
使用它是为了安全起见
var data = JSON.parse(Buffer.concat(arr).toString());
无需其他模块 .
只是用
var parsedObj = JSON.parse(yourObj);
我认为这方面没有任何安全问题
我用fs-extra . 我非常喜欢它 - 因为它支持回调 - 它也支持Promises . 所以它只是让我以更易读的方式编写我的代码:
它还有许多有用的方法,它们不与标准
fs
模块一起提供,并且最重要的是,它还将方法与本机fs
模块连接起来并对它们进行预定 .所以它基本上都是优点 . 我希望其他人觉得这很有用 .
这很简单,您可以使用
JSON.stringify(json_obj)
将JSON转换为字符串,并使用JSON.parse("your json string")
将字符串转换为JSON .使用
JSON.parse(str);
. 阅读更多here .这里有些例子: