чи є потреба в 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.