我应该如何使用Node.js解析JSON ?是否有一些模块可以安全地验证和解析JSON ?
当前回答
包括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中。另外,由于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)
}
})
}
我想提一下全局JSON对象的替代方案。 JSON。解析和JSON。stringify都是同步的,所以如果你想处理大对象,你可能想查看一些异步JSON模块。
看看:https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
如果你需要用Node.js以一种安全的方式解析JSON(也就是说:用户可以输入数据,或者一个公共API),我建议使用secure- JSON -parse。
其用法类似于默认的JSON。解析,但它会保护你的代码:
原型中毒 和构造函数滥用:
const badJson = '{ "a": 5, "b": 6, "__proto__": { "x": 7 }, "constructor": {"prototype": {"bar": "baz"} } }'
const infected = JSON.parse(badJson)
console.log(infected.x) // print undefined
const x = Object.assign({}, infected)
console.log(x.x) // print 7
const sjson = require('secure-json-parse')
console.log(sjson.parse(badJson)) // it will throw by default, you can ignore malicious data also
您可以使用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。了解您的平台是如何做到这一点的,并使用流程。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');
但是,我不建议这样做,原因如下:
require is synchronous. If you have a very big JSON file, it will choke your event loop. You really need to use JSON.parse with fs.readFile. require will read the file only once. Subsequent calls to require for the same file will return a cached copy. Not a good idea if you want to read a .json file that is continuously updated. You could use a hack. But at this point, it's easier to simply use fs. If your file does not have a .json extension, require will not treat the contents of the file as 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,请确保完成了错误处理。
使用JSON对象:
JSON.parse(str);
推荐文章
- 窗口。亲近与自我。close不关闭Chrome中的窗口
- 为什么PHP的json_encode函数转换UTF-8字符串为十六进制实体?
- 同步和异步编程(在node.js中)的区别是什么?
- 在d3.js中调整窗口大小时调整svg的大小
- 如何编辑通过npm安装的节点模块?
- 如何将两个字符串相加,就好像它们是数字一样?
- 绑定多个事件到一个监听器(没有JQuery)?
- Ajax会调用什么样的响应,比如'for (;;);{json data}的意思?
- 在JavaScript中将JSON字符串解析为特定对象原型
- 将字符串“true”/“false”转换为布尔值
- 如何使用JavaScript代码获得浏览器宽度?
- event.preventDefault()函数在IE中无法工作
- indexOf()和search()的区别是什么?
- 错误:'types'只能在.ts文件中使用- Visual Studio Code使用@ts-check
- React-Native:应用程序未注册错误