чи є потреба в json в node.js


247

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

Якби я хотів включити інший файл JavaScript, я міг би просто використовувати require. Зараз я використовую readFileSyncі __dirnameотримую JSON, що, на мою думку, це некрасивий спосіб зробити це.

Чи є щось подібне для вимоги, що дозволяє мені завантажити файл JSON?


Дивіться цей же питання: stackoverflow.com/questions/4662851 / ...
holygeek

@coen Що ви маєте на увазі під "включити файл JSON"? Читати та розбирати? Якщо так, то можливо дублікат: stackoverflow.com/questions/5726729 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

2
так; читати та розбирати. Але це специфічно читання файлу , подібне до читання файлу js, тому це не дублікат, і відповідь козелкера все ще справедлива.
Коен

Відповіді:


455

Станом на вузол v0.5.x так, ви можете вимагати свого JSON так само, як і файл js.

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

У ES6:

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


1
Це правда? Це не працює для мене, і github.com/joyent/node/isissue/1357 та github.com/joyent/node/pull/584 припускають, що це не повинно.
користувач161642

12
Вам потрібно скористатися Requ ('./ somefile.json'), якщо файл знаходиться в одному каталозі (зверніть увагу на крапку та косу рису).
Стів Віллок

66
З цим є одна готча. Результат буде кешований! Тож якщо вам з якихось причин потрібно знову завантажити дані (скажімо, під час роботи), ви отримаєте такий самий старий результат.
Juho Vepsäläinen

41
Примітка: розширення .jsonзначимо
Nha

9
добре сформований json теж допомагає
sdeburca

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
}

1
@coen так, ми завжди використовуємо __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, ми не отримаємо нових даних, навіть якщо повторно запустити потрібно ('./ JsonFile.json')

2) fs.readFile або fs.readFileSync завжди буде перечитувати файл та отримувати зміни


Зауважте, що метод fs використовує каталог, з якого було запущено вузол, як вихідну точку, а не каталог, де знаходиться вихідний код, який виконує зчитування, тоді як метод "вимагати" використовує шлях відносно місця імпортування вихідного коду. Таким чином, ви будете мати відмінності в шляхах між двома методами, як тільки ви зберігаєте речі в різних папках.
Will59

3

Ви навіть можете використовувати потребу свого JSON, не вказуючи розширення .json . Це дозволить вам змінити розширення файлу на .js без змін у вашому імпорті.

якщо ми маємо ./myJsonFile.json в одному каталозі.

const data = require('./myJsonFile')

Якщо в майбутньому ви зміните ./myJsonFile.json на ./myJsonFile.js, нічого не слід змінювати в імпорті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.