如何从JSON保存和读取数据

时间:2019-02-11 15:00:00

标签: node.js json express

我正在尝试将一百万个数据保存到NodeJS应用程序中的JSON文件中。主要思想是将一个1000x1000像素的网格保存为具有x,y位置和颜色id的数组,以便每个像素都有一个坐标和一个颜色。我的实际代码生成一个示例:

所以我有一个生成数据的功能,并且可以使用fs.writeFile()保存它。

//resetPos('test.json');
function resetPos(path) {
    let data = [];
    for (let y = 1; y <= 1000; y++){
        data.push([]);
    }
    data.forEach(function(e, i){
        for (let x = 1; x <= 1000; x++) {
            e.push([
                "x": x,
                "y": i,
                "color": "#cccccc"
            ]);
        }
    });
    fs.writeFile(path, JSON.stringify(data), function(err){
        if(err) throw err;
    });
    console.log(data);
}
let global_data = fs.readFileSync("test.json");
console.log(global_data[0]);

当我读取文件时,它显示为“ 91”。我已经尝试过使用.toJSON()和.toString(),但是没有按我的意愿进行。我想得到一个x,y坐标作为data [y] [x];

2 个答案:

答案 0 :(得分:0)

通常,您可以使用Node的 require 方法读取JSON文件。

示例:const myJSON = requrie('./file.json') myJSON将把file.json中的JSON数据作为普通Javascript对象保存。

您可以使用以下代码自己编写JSON文件:

const fs = require('fs'); 
fs.writeFile('file.json', json, 'utf8', callback);

答案 1 :(得分:0)

基本上,有两种方法可以读取Node.js中的.json文件。

您的第一个选择是使用require函数,该函数通常用于导入.js文件,但也可以将其用于.json文件:

const packageJson = require('./package.json');

此方法的优点是您可以将.json文件的内容作为已解析的JavaScript对象或数组来获取。这种方法的缺点是,如果发生了某些更改,您将无法在当前进程中重新加载文件,因为require会高速缓存任何已加载文件的内容,并且您总是会得到高速缓存的值。

您的第二个选项与之完全相反:它允许您重新加载内容,但需要您自己解析文件。为此,您可以使用fs模块的readFile函数:

const fs = require('fs');

fs.readFile('./package.json', { encoding: 'utf8' }, (err, data) => {
  const packageJson = JSON.parse(data);

  // ...
});

如果您想使用asyncawait,并且如果您使用Node.js的util.promisify函数,那么您也可以以同步方式编写此代码,但要保持异步代码:

const fs = require('fs'),
      { promisify } = require('util');

const readFile = promisify(fs.readFile);

(async () => {
  const data = await readFile('./package.json', { encoding: 'utf8' });
  const packageJson = JSON.parse(data);

  // ...
})();

除此之外,还有fs.readFileSync函数,该函数以同步方式工作,但是出于软件性能的考虑,您应该远离该函数。

要编写JSON文件,您唯一的选择是使用writeFile模块的fs函数,该函数的工作原理与readFile模块相同:

const fs = require('fs');

const packageJson = { /* ... */ };
const data = JSON.parse(packageJson);

fs.writeFile('./package.json', data, { encoding: 'utf8' }, err => {
  // ...
});

同样,您可以使用如上所述的util.promisify函数来使asyncawait正常工作,也可以使用同步fs.writeFileSync函数(再次,我不推荐)。