Используя Node.JS, как мне прочитать файл JSON в (серверную) память?

Фон

Я экспериментирую с Node.js и хотел бы прочитать объект JSON из текстового файла или файла .js(что лучше?) в память, чтобы я мог быстро получить доступ к этому объекту от кода. Я понимаю, что есть такие вещи, как Монго, Альфред и т.д., Но сейчас это не то, что мне нужно.

Вопрос

Как я могу прочитать объект JSON из текстового или js файла и в память сервера с помощью JavaScript/ Node?

Ответ 1

Синхронизация:

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

Ответ 2

Самый простой способ, который я нашел для этого, - просто использовать require и путь к вашему файлу JSON.

Например, предположим, что у вас есть следующий JSON файл.

test.json

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

Затем вы можете легко загрузить его в свое приложение node.js, используя require

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

Ответ 3

Асинхронный есть по какой-то причине! Бросает камень в @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
}

Ответ 4

Как минимум в Node v8.9.1, вы можете просто сделать

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

и получить доступ ко всем элементам объекта JSON.

Ответ 5

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

Ответ 6

использование node-fs-extra (асинхронное ожидание)

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

readJsonFile() // prints your json object

Ответ 7

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 в документах файловой системы!
надеюсь, эта помощь для вас!

Ответ 8

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

Ответ 9

Использовать пакет 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) 

Ответ 10

Если вы ищете полное решение для 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 )
        }
   });
})

Структура каталогов:

введите описание изображения здесь