背景
我正在对 Node.js 进行一些实验,并且想从文本文件或 .js 文件(哪个更好??)中读取 JSON 对象到内存中,以便我可以从代码中快速访问该对象。我意识到那里有诸如 Mongo、Alfred 之类的东西,但这不是我现在需要的。
问题
如何使用 JavaScript/Node 从文本或 js 文件中读取 JSON 对象并进入服务器内存?
同步:
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);
});
我发现最简单的方法是使用 require
和 JSON 文件的路径。
例如,假设您有以下 JSON 文件。
测试.json
{
"firstName": "Joe",
"lastName": "Smith"
}
然后,您可以使用 require
轻松地将其加载到您的 node.js 应用程序中
var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);
require
是同步运行的。深入了解here
require
运行该代码吗?如果是这样,那么您确实需要控制 json 文件的来源,否则攻击者可能会在您的计算机上运行恶意代码。
异步是有原因的!向@mihai 扔石头
否则,这是他在异步版本中使用的代码:
// 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
}
至少在 Node v8.9.1 中,你可以这样做
var json_data = require('/path/to/local/file.json');
并访问 JSON 对象的所有元素。
file.json
,数据将从第一次加载开始。我没有资源支持这一点,但我在我正在构建的应用程序中有这个
2022 年的答案,使用 ES6 模块语法和 async/await
在现代 JavaScript 中,这可以一次性完成,无需安装额外的包:
import { readFile } from 'fs/promises';
let data = JSON.parse(await readFile("filename.json", "utf8"));
添加 try/catch
块以根据需要处理异常。
require('./jsonfile.xyz')
。
在 Node 8 中,您可以使用内置的 util.promisify()
来异步读取这样的文件
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
。
fs/promises
。注意:API 是实验性的:nodejs.org/api/fs.html#fs_fs_promises_api
.readFile
是异步,但不是 async
。意思是,该函数没有用 async
关键字定义,也没有返回 Promise,所以你不能做 await fs.readFile('whatever.json');
使用 fs-extra 包非常简单:
同步:
const fs = require('fs-extra')
const packageObj = fs.readJsonSync('./package.json')
console.log(packageObj.version)
异步:
const fs = require('fs-extra')
const packageObj = await fs.readJson('./package.json')
console.log(packageObj.version)
使用 node-fs-extra (异步等待)
const readJsonFile = async () => {
const myJsonObject = await fs.readJson('./my_json_file.json');
console.log(myJsonObject);
}
readJsonFile() // prints your json object
https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfile_file_options_callback
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/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfilesync_file_options
您可以在文件系统文档中找到 Node.js 的所有用法!希望这对你有帮助!
function parseIt(){
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);
}
});
}
async function test(){
jsonData = await parseIt();
var parsedJSON = JSON.parse(jsonData);
var testSuite = parsedJSON['testsuites']['testsuite'];
console.log(testSuite);
}
test();
如果您正在寻找一个完整的解决方案,用于 Async
通过错误处理从 Relative Path
加载 JSON 文件
// 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 )
}
});
})
目录结构:
https://i.stack.imgur.com/Bz7jB.png
不定期副业成功案例分享
let imported = require("file.json")
。 (2) JSON.parse 必须是异步的,因为我使用这段代码将一个 70mb 的 JSON 文件作为对象加载到内存中。这种方式需要几毫秒,但如果我使用require()
,它会chugs。require
为许多许多版本提供原生 json 支持,如果您只想加载 json 文件,则此答案不再适用。只需使用let data = require('./yourjsonfile.json')
就可以了(附注,如果 require 的性能影响您的代码,那么您遇到的问题远远超出“想要加载 .json 文件”)