769

背景

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

问题

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

4

12 回答 12

1430

同步:

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);
});
于 2012-04-04T12:27:19.797 回答
453

我发现最简单的方法就是使用requireJSON 文件的路径。

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

测试.json

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

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

var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);
于 2014-10-19T02:14:04.047 回答
60

异步是有原因的!向@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
}
于 2012-04-04T12:33:10.283 回答
51

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

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

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

于 2017-11-11T03:10:04.747 回答
21

2021 年的答案,使用 ES6 模块语法和 async/await

在现代 JavaScript 中,这可以一次性完成,无需安装额外的包:

import { readFile } from 'fs/promises';

let data = JSON.parse(await readFile("filename.json", "utf8"));

根据需要添加一个try/catch块来处理异常。

于 2021-03-12T15:25:23.333 回答
19

在 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
  })
于 2017-08-31T12:36:03.540 回答
7

使用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) 
于 2019-05-29T20:30:42.953 回答
6

使用node-fs-extra (异步等待)

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

readJsonFile() // prints your json object
于 2019-07-09T13:18:19.707 回答
2

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 的所有用法!
希望这对你有帮助!

于 2016-11-02T20:19:39.703 回答
2
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();
于 2019-04-20T02:51:31.200 回答
0

这么多的答案,没有人做过基准来比较同步、异步和需要。我在这里描述了通过 require、readFileSync 和 readFile 在内存中读取 json 的用例的区别。

于 2020-01-30T07:28:18.020 回答
-1

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

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

目录结构:

在此处输入图像描述

于 2017-10-05T05:04:43.613 回答