使用Node.JS,如何将JSON文件读入(服务器)内存?

背景

我正在对Node.js做一些实验,并想从文本文件或. js文件(哪个更好??)中读取JSON对象到内存中,以便我可以从代码中快速访问该对象。我意识到那里有Mongo、Alfred等东西,但这不是我现在需要的。

问题

如何使用JavaScript/Node从文本或js文件中读取JSON对象并进入服务器内存?

696790 次浏览

同步:

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);});

异步存在是有原因的!向@mihai扔石头

否则,以下是他在异步版本中使用的代码:

// Declare variablesvar fs = require('fs'),obj
// Read the file and send to the callbackfs.readFile('path/to/file', handleFile)
// Write the callback functionfunction handleFile(err, data) {if (err) throw errobj = JSON.parse(data)// You can now play with your datas}

我发现的最简单的方法是只使用require和JSON文件的路径。

例如,假设您有以下JSON文件。

test.json

{"firstName": "Joe","lastName": "Smith"}

然后,您可以使用require轻松地将其加载到node.js应用程序中

var config = require('./test.json');console.log(config.firstName + ' ' + config.lastName);

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);});
// optionsfs.readFile('/etc/passwd', 'utf8', callback);

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfilesync_file_options

您可以在文件系统文档中找到Node.js的所有用法!
希望对你有帮助!

在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})

如果您正在寻找Async的完整解决方案,可以使用错误处理从Relative Path加载JSON文件

  // Global variables// Request path module for relative pathconst path = require('path')// Request File System Modulevar 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 URLlet reqPath = path.join(__dirname, '../mock/users.json');
//Read JSON from relative path of this filefs.readFile(reqPath , 'utf8', function (err, data) {//Handle Errorif(!err) {//Handle Successconsole.log("Success"+data);// Parse Data to JSON ORvar jsonObj = JSON.parse(data)//Send back as Responseres.end( data );}else {//Handle Errorres.end("Error: "+err )}});})

目录结构:

在此处输入图片描述

至少在Node v8.9.1中,你可以这样做

var json_data = require('/path/to/local/file.json');

并访问JSON对象的所有元素。

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();

使用fs-额外包非常简单:

同步:

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-额外(异步等待)

const readJsonFile = async () => {const myJsonObject = await fs.readJson('./my_json_file.json');console.log(myJsonObject);}
readJsonFile() // prints your json object

答案太多了,但是从来没有人做过一个基准来比较sync vs async vs需要。我通过需要、readFileSync和readFile这里描述了在内存中读取json的用例的区别。

2022年的答案,使用ES6模块语法和async/wait

在现代JavaScript中,这可以作为一行代码完成,而无需安装额外的包:

import { readFile } from 'fs/promises';
let data = JSON.parse(await readFile("filename.json", "utf8"));

添加try/catch块以根据需要处理异常。

2022年的答案,使用v8导入断言

import jsObject from "./test.json" assert { type: "json" };console.log(jsObject)

动态导入

const jsObject = await import("./test.json", {assert: { type: "json" }});console.log(jsObject);

阅读更多:v8导入断言