背景
我正在用node.js做一些实验,想从文本文件或.js文件(哪个更好)中读取JSON对象??)进入内存,以便我可以从代码中快速访问该对象。我知道外面有蒙古人、阿尔弗雷德等东西,但这不是我现在需要的。问题
如何使用Javascript/node从文本或JS文件中读取JSON对象并将其读取到服务器内存中?
什么叫服务器内存?您的nodejs脚本将工作只要您使其工作,但您必须将数据存储在某个地方,除非您使nodejs脚本持久化。
同步:
var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('file', 'utf8'));
设置:
var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
});
我认为json.parse是同步的,它直接来自V8,这意味着即使使用异步方式,人们也必须小心处理大型的json文件。因为它会把节点绑起来。
为了完整。它们存在一个名为jsonfile的NPM。
这是怎么回事?@mihai async json错误注册表代码
我真不敢相信这么简单的事情竟然找不到。我从谷歌得到的每一个答案都是在做一个httprequest或者使用jquery或者在浏览器中做的。
两点:(1)同步答案应该是let imported = require("file.json")。(2)json.parse必须是异步的,因为我使用此代码将70MB的json文件作为对象加载到内存中。这样需要几毫秒,但如果我使用require(),它就会发出嘎嘎声。
还有一点:这是异步的,但不是流式的。为此,您需要一个库(例如oboe.js)。区别在于异步不会阻塞您的执行线程,但是除非您进行流式处理,否则您仍然会看到大量的内存消耗峰值(比如处理70MB JSON文件的450MB内存)。
@Kylebaker JSON.parse是同步的。require比JSON.parse做得更多。JSON.parse只是在分析JSON。require正在分析Javascript。我相信你能弄明白为什么后者比较慢。
太好了,谢谢你:)我试着使用require("file.json"),它工作得很好,但是我的file.json的路径并不是每个操作系统都能修复的,所以它现在失败了,它工作得很好。谢谢
对于在2019年及以后找到这个答案的人来说,node.js已经通过require为许多版本提供了本机JSON支持,如果您只想加载一个JSON文件,这个答案将不再适用。只需使用let data = require('./yourjsonfile.json')就可以了(需要注意的是,如果require的性能影响到代码,那么除了"想要加载一个.json文件"之外,还存在很多问题)
我有一个双向的easiest发现这是只使用你的requireJSON文件的路径。
例如,你有一个suppose下面的JSON文件。
test.json
{
"firstName":"Joe",
"lastName":"Smith"
}
你可以很容易地加载,然后在你的应用程序使用requireNode.js这
var cOnfig= require('./test.json');
console.log(config.firstName + ' ' + config.lastName);
大家都知道,如果我没记错的话,节点中的require会同步运行。在这里潜水
@对我有用的ram可能是你在test.json的位置不同于他的例子。我用的是node 5.0。
这种方法的另一个问题/好处是缓存了所需的数据,除非您专门删除了缓存的实例。
"require"用于在应用程序的整个生命周期内加载正在使用的模块或配置文件。使用此项加载文件似乎不正确。
对我来说,这不起作用:(
我不知道,谢谢!
我认为这可能是一个安全威胁。如果正在加载的JSON文件包含JS代码,require会运行该代码吗?如果是这样,那么您确实需要控制JSON文件的来源,否则攻击者可能会在您的计算机上运行恶意代码。
异步是有原因的!在抛出的石头"米哈伊
此外,这里使用的是异步的代码和版本:
// Declare variables
var fs = require('fs'),
obj
// Read the file and send to the callback
fs.readFile('path/to/file', handleFile)
// Write the callback function
function handleFile(err, data) {
if (err) throw err
obj = JSON.parse(data)
// You can now play with your datas
}
同意:),还添加了Async
太好了:-)不过,我不喜欢内联回调,这会导致回调噩梦,我宁愿避免。
它在那里是有原因的。除非你想同步。
至少在v8.9.1节点,你可以去
var json_data = require('/path/to/local/file.json');
和访问的所有元素的JSON对象。
这种方法只加载一次文件。如果在新的需求(不重新启动程序)之后更改file.json,数据将从第一次加载开始。我没有来源支持这个,但我在我正在构建的应用程序中有这个
你的回答令人遗憾地不完整。得到的是一个对象,甚至不需要实现ToString()。
@gray这个问题希望能够以对象而不是字符串的形式访问对象。卢卡斯在一期杂志上提到,这个答案很好。
使用require还将执行文件中的任意代码。这种方法不安全,我建议不要使用它。
对8节点可以使用内置的util.promisify()asynchronously读到像这样的文件
const {promisify} = require('util')
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)
readFileAsync(`${__dirname}/my.json`, {encoding: 'utf8'})
.then(cOntents=> {
const obj = JSON.parse(contents)
console.log(obj)
})
.catch(error => {
throw error
})
.readFile已经是异步的,如果您要查找同步版本,它的名称是.readFileSync。
如果您想使用承诺,那么从节点10开始还有fs/promises。注:该API是实验性的:nodejs.org/api/fs.html fs fs承诺api
https://nodejs.org /区/最新的API - v6.x /文档/ FS FS / fs.html # _ _ ReadFile _ _ _回调选项文件
var fs = require('fs');
fs.readFile('/etc/passwd', (err, data) => {
if (err) throw err;
console.log(data);
});
// options
fs.readFile('/etc/passwd', 'utf8', callback);
https://nodejs.org /区/最新的API - v6.x /文档/ FS FS / fs.html # _ _ readfilesync _ _选项文件
你可以找到所有的日志文件在文件系统(Node.js的!希望这帮助你!
parseit function(){
return new Promise(function(res){
try{
var fs = require('fs');
const dirPath = 'K:\\merge-xml-junit\\xml-results\\master.json';
fs.readFile(dirPath,'utf8',function(err,data){
if(err) throw err;
res(data);
})}
catch(err){
res(err);
}
})
}
异步函数测试(){
jsOnData= await parseIt();
var parsedJSON = JSON.parse(jsonData);
var testSuite = parsedJSON['testsuites']['testsuite'];
console.log(testSuite);
}
试验();
如果你正在寻找完整的解决方案,从Relative PathAsyncJSON文件,加载与错误处理
// Global variables
// Request path module for relative path
const path = require('path')
// Request File System Module
var fs = require('fs');
// GET request for the /list_user page.
router.get('/listUsers', function (req, res) {
console.log("Got a GET request for list of users");
// Create a relative path URL
let reqPath = path.join(__dirname, '../mock/users.json');
//Read JSON from relative path of this file
fs.readFile(reqPath , 'utf8', function (err, data) {
//Handle Error
if(!err) {
//Handle Success
console.log("Success"+data);
// Parse Data to JSON OR
var jsOnObj= JSON.parse(data)
//Send back as Response
res.end( data );
}else {
//Handle Error
res.end("Error:"+err )
}
});
})
目录结构: