在node.js中是否需要json


246

我想在我的JavaScript代码中包含与我的JavaScript源文件在同一目录中的几个JSON文件。

如果我想包含另一个JavaScript文件,可以直接使用require。现在,我正在使用readFileSync__dirname获取JSON,我认为这是执行此操作的丑陋方法。

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


看到这个类似的问题:stackoverflow.com/questions/4662851/...
holygeek

@coen“包含JSON文件”是什么意思?阅读并解析吗?如果是的话,可能重复:stackoverflow.com/questions/5726729/...
西罗桑蒂利郝海东冠状病六四事件法轮功

2
是; 阅读和解析。但这是专门读取文件,类似于读取js文件,因此这不是重复项,goatslacker的答案仍然有效。
科恩2014年

Answers:


453

从节点v0.5.x开始,是的,您可以像需要js文件一样要求JSON。

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

在ES6中:

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



12
您需要使用require('./ somefile.json')并假设文件位于同一目录中(注意点和斜杠)。
史蒂夫·威尔考克

66
有一个陷阱。结果将被缓存!因此,如果由于某种原因需要再次加载数据(例如在cronjob中),则会得到相同的旧结果。
JuhoVepsäläinen13年

41
注意:扩展名.json似乎很重要
nha 2014年

9
以及形成JSON也有帮助
sdeburca

40

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

因此,您只能将其require用于有效的JSON文档。

data.json

{
  "name": "Freddie Mercury"
}

main.js

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

console.log(obj.name); 
//Freddie Mercury

20

否。无论是使用readFile还是readFileSync(后者仅在启动时使用)。

或使用现有的库

或者将您的配置写入js文件,而不是json文件,例如

module.exports = {
  // json
}

1
@coen是的,我们总是使用__dirname相对路径。
雷诺斯2011年

遇到这个问题,它将在本地导入JSON,而不是在AWS的EC2实例上的docker容器中导入。...而不是尝试配置mime类型或其他,我只是改用JS而不是JSON。希望这可以帮助某人。
Erik Grosskurth

16

最常见的两种

第一种方式:

let jsonData = require('./JsonFile.json')

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

要么

import jsonData from ('./JsonFile.json')

第二种方式:

1)同步

const fs = require('fs')
let jsonData = JSON.parse(fs.readFileSync('JsonFile.json', 'utf-8'))

2)异步

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

  jsonData = JSON.parse(data)
})

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

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


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

3

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

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

const data = require('./myJsonFile')

如果将来您将./myJsonFile.json更改为./myJsonFile.js,则导入时无需进行任何更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.