czy istnieje potrzeba JSON w node.js


247

Chciałbym dołączyć kilka plików JSON do mojego kodu JavaScript, które znajdują się w tym samym katalogu, co mój plik źródłowy JavaScript.

Gdybym chciał dołączyć inny plik JavaScript, mógłbym po prostu użyć require. Teraz używam readFileSynci __dirnameotrzymuję JSON, co moim zdaniem jest brzydkim sposobem na zrobienie tego.

Czy istnieje coś podobnego do wymagania, które pozwala mi załadować plik JSON?



@coen Co rozumiesz przez „dołącz plik JSON”? Przeczytać i parsować? Jeśli tak, możliwe duplikaty: stackoverflow.com/questions/5726729/…
Ciro Santilli 郝海东 冠状 病 六四 事件

2
tak; czytaj i parsuj. Ale jest to konkretnie odczyt pliku , podobny do odczytu pliku js, więc nie jest to duplikat, a odpowiedź kozła ofiarnego jest nadal aktualna.
Coen

Odpowiedzi:


455

Począwszy od węzła v0.5.x tak, możesz wymagać JSON, tak jak potrzebujesz pliku js.

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

W ES6:

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


1
Czy to prawda? Dla mnie to nie działa, a github.com/joyent/node/issues/1357 i github.com/joyent/node/pull/584 sugerują, że nie powinno.
user161642,

12
Musisz użyć wymaga ('./ somefile.json') zakładając, że plik znajduje się w tym samym katalogu (zwróć uwagę na kropkę i ukośnik).
Steve Willcock

66
Jest w tym jeden problem. Wynik zostanie zapisany w pamięci podręcznej! Więc jeśli z jakiegoś powodu musisz ponownie załadować dane (powiedzmy na cronjob), otrzymasz ten sam stary wynik.
Juho Vepsäläinen

41
Uwaga: rozszerzenie .jsonwydaje się mieć znaczenie
nha

9
dobrze uformowany json też pomaga
sdeburca

40

Pliki JSON nie wymagają jawnego zestawienia eksportu. Nie musisz eksportować, aby użyć go jako plików JavaScript.

Możesz użyć tylko requireważnego dokumentu JSON.

data.json

{
  "name": "Freddie Mercury"
}

main.js

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

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

20

Nie. Albo użyj readFilealbo readFileSync(to ostatnie tylko podczas uruchamiania).

Lub użyj istniejącej biblioteki, takiej jak

Alternatywnie zapisz swoją konfigurację w pliku js zamiast w pliku json jak

module.exports = {
  // json
}

1
@coen tak, zawsze używamy __dirnamedo tworzenia względnych ścieżek.
Raynos

Wpadłem na to, gdzie zaimportuje JSON lokalnie, ale nie w kontenerze dokera w mojej instancji EC2 w AWS ... Zamiast próbować konfigurować typy MIME i co nie, po prostu przełączyłem się na JS zamiast JSON. Mam nadzieję, że to może komuś pomóc.
Erik Grosskurth

17

Dwa najczęstsze

Pierwszy sposób:

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

let jsonData = require('./JsonFile') // jeśli pominiesz .json również działa

LUB

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

Drugi sposób:

1) synchronicznie

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

2) asynchronicznie

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

  jsonData = JSON.parse(data)
})

Uwaga: 1) jeśli zmienimy plik JsonFile.json, nie otrzymamy nowych danych, nawet jeśli uruchomimy ponownie wymagają ('./ JsonFile.json')

2) Fs.readFile lub fs.readFileSync zawsze będą ponownie czytać plik i otrzymywać zmiany


Zauważ, że metoda fs używa katalogu, z którego uruchomiono węzeł, jako punktu początkowego, a nie katalogu, w którym rezyduje kod źródłowy wykonujący odczyt, podczas gdy metoda „wymaga” używa ścieżki względem lokalizacji kodu źródłowego importu. Będziesz miał różnice w ścieżkach między tymi dwiema metodami, jak tylko będziesz przechowywać rzeczy w różnych folderach.
Will59

3

Możesz nawet użyć wymagania JSON bez określania rozszerzenia .json . Umożliwi to zmianę rozszerzenia pliku na .js bez żadnych zmian w importowaniu.

zakładając, że mamy plik ./myJsonFile.json w tym samym katalogu.

const data = require('./myJsonFile')

Jeśli w przyszłości zmienisz plik ./myJsonFile.json na ./myJsonFile.js, nic nie powinno zostać zmienione podczas importu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.