在node.js中是否需要json

Coe*_*oen 219 json require node.js

我想在我的JavaScript代码中包含几个JSON文件,这些文件与我的JavaScript源文件位于同一目录中.

如果我想要包含另一个JavaScript文件,我可以简单地使用require.现在我正在使用readFileSync__dirname获得JSON,我认为这是一种丑陋的方式.

是否有类似的要求,使我能够加载JSON文件?

goa*_*ker 408

从节点v0.5.x开始,您可以像需要js文件那样需要JSON.

var someObject = require('./somefile.json')

在ES6中:

import someObject from ('./somefile.json')

  • 这有一个问题.结果将被缓存!因此,如果您由于某种原因需要再次加载数据(比如在cronjob中),您将获得相同的旧结果. (59认同)
  • 注意:扩展名`.json`似乎很重要 (39认同)
  • 假设文件位于同一目录中(请注意点和斜杠),您需要使用require('./ somefile.json'). (12认同)
  • 是的,fs.readFile更适合这些目的. (6认同)
  • 形成良好的json也有帮助 (6认同)
  • 这是真的?它对我不起作用,并且 https://github.com/joyent/node/issues/1357 和 https://github.com/joyent/node/pull/584 建议它不应该。 (2认同)
  • 需要注意的是,如果您确实希望将 .json 之外的其他文件解析为 json,您可以教 require 如何读取它。`require.extensions['.har'] = require.extensions['.json']; var blar = require('./file.har');` 现在将被视为 json (2认同)

ser*_*kan 30

JSON文件不需要显式的export语句.您无需导出即可将其用作Javascript文件.

因此,您只能使用require有效的JSON文档.

data.json

{
  "name": "Freddie Mercury"
}
Run Code Online (Sandbox Code Playgroud)

main.js

var obj = require('data.json');

console.log(obj.name); 
//Freddie Mercury
Run Code Online (Sandbox Code Playgroud)


Ray*_*nos 19

不.使用readFilereadFileSync(后者仅在启动时).

或者使用现有的库

或者在js文件中编写配置,而不是像json文件

module.exports = {
  // json
}
Run Code Online (Sandbox Code Playgroud)


raj*_*app 8

最常见的两种

第一种方式:

let jsonData = require('./JsonFile.json')
Run Code Online (Sandbox Code Playgroud)

let jsonData = require('./JsonFile') //如果我们省略.json也可以

要么

import jsonData from ('./JsonFile.json')
Run Code Online (Sandbox Code Playgroud)

第二种方式:

1)同步

const fs = require('fs')
let jsonData = JSON.parse(fs.readFileSync('JsonFile.json', 'utf-8'))
Run Code Online (Sandbox Code Playgroud)

2)异步

const fs = require('fs')
let jsonData = {}
fs.readFile('JsonFile.json', 'utf-8', (err, data) => {
  if (err) throw err

  jsonData = JSON.parse(data)
})
Run Code Online (Sandbox Code Playgroud)

注意:1)如果我们更改了JsonFile.json,即使重新运行require('./ JsonFile.json'),也不会获得新数据。

2)fs.readFile或fs.readFileSync将始终重新读取文件并进行更改

  • 请注意,fs 方法使用启动节点的目录作为起点,而不是执行读取的源代码所在的目录,而“require”方法使用相对于导入源代码位置的路径。因此,一旦将内容存储在不同的文件夹中,两种方法之间的路径就会有所不同。 (3认同)

Igo*_*ich 7

您甚至可以使用JSON 的require而不指定扩展名.json。它可以让您将文件扩展名更改为.js,而无需对导入进行任何更改。

假设我们在同一目录中有./myJsonFile.json 。

const data = require('./myJsonFile')
Run Code Online (Sandbox Code Playgroud)

如果将来您将./myJsonFile.json更改为./myJsonFile.js,则导入中不应更改任何内容。


dre*_*mLo 6

您可以使用 node.js v14 实验性 json 模块标志导入 json 文件。更多细节在这里

文件.js

import data from './folder/file.json'

export default {
  foo () {
    console.log(data)
  }
}
Run Code Online (Sandbox Code Playgroud)

你用 node --experimental-json-modules file.js


som*_*som 5

一个用于 node 15 模块的漂亮的非缓存异步单行:

import { readFile } from 'fs/promises';

const data = await readFile('{{ path }}').then(json => JSON.parse(json)).catch(() => null);
Run Code Online (Sandbox Code Playgroud)