есть ли необходимость для json в node.js

247

Я хотел бы включить пару файлов JSON в мой код JavaScript, которые находятся в том же каталоге, что и мой исходный файл JavaScript.

Если бы я хотел включить другой файл JavaScript, я мог бы просто использовать require. Теперь я использую readFileSyncи __dirnameполучаю JSON, что, на мой взгляд, является уродливым способом сделать это.

Есть ли что-то подобное для require, которое позволяет мне загружать JSON-файл?

Coen
источник
Смотрите этот похожий вопрос: stackoverflow.com/questions/4662851/…
holygeek
@coen Что вы подразумеваете под «включить файл JSON»? Прочитать и разобрать это? Если да, возможный дубликат: stackoverflow.com/questions/5726729/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
2
да; читать и разбирать. Но это, в частности, чтение файла , похожее на чтение файла js, так что это не дубликат, и ответ goatslacker все еще действителен.
Коен

Ответы:

455

Начиная с узла v0.5.x да, вы можете требовать свой JSON так же, как и файл js.

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

В ES6:

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

goatslacker
источник
1
Это правда? Это не работает для меня, и github.com/joyent/node/issues/1357 и github.com/joyent/node/pull/584 предполагают, что это не должно.
user161642
12
Вам нужно использовать require ('./ somefile.json'), предполагая, что файл находится в том же каталоге (обратите внимание на точку и косую черту).
Стив Уиллкок
66
Есть одна ошибка с этим. Результат будет кеширован! Так что если вам по какой-то причине понадобится снова загрузить данные (скажем, в cronjob), вы получите тот же старый результат.
Юхо Вепсяляйнен
41
Примечание: расширение, .jsonпохоже, имеет значение
ня,
9
Хорошо сформированный
JSON
40

Файлы JSON не требуют явного оператора экспорта. Вам не нужно экспортировать, чтобы использовать его в качестве файлов 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
}
Raynos
источник
1
@ Да, мы всегда используем __dirnameотносительные пути.
Рэйнос
Столкнулся с этим, где он будет импортировать JSON локально, но не в контейнер докера на моем экземпляре EC2 в AWS ... Вместо того, чтобы пытаться настраивать типы MIME, а что нет, я просто переключился на JS вместо JSON. Надеюсь, что это может кому-то помочь.
Эрик
17

Два самых распространенных

Первый способ:

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 всегда будут перечитывать файл и получать изменения

rajmobiapp
источник
Обратите внимание, что метод fs использует каталог, из которого был запущен узел, в качестве отправной точки, а не каталог, в котором находится исходный код, выполняющий чтение, тогда как метод require требует путь относительно местоположения импортируемого исходного кода. Таким образом, вы будете иметь различия в путях между этими двумя методами, как только вы будете хранить вещи в разных папках.
Will59
3

Вы даже можете использовать require вашего JSON без указания расширения .json . Это позволит вам изменить расширение файла на .js без каких-либо изменений в импорте.

при условии, что у нас есть ./myJsonFile.json в том же каталоге.

const data = require('./myJsonFile')

Если в будущем вы измените ./myJsonFile.json на ./myJsonFile.js, при импорте ничего не должно быть изменено.

Игорь Литвинович
источник
1

Вы можете импортировать файлы json, используя флаг экспериментальных модулей json для node.js v14. Подробнее здесь

file.js

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

export default {
  foo () {
    console.log(data)
  }
}

И вы называете это с node --experimental-json-modules file.js

Ката-замок
источник