มีความต้องการสำหรับ json ใน node.js


247

ฉันต้องการรวมไฟล์ JSON สองสามไฟล์ในรหัส JavaScript ของฉันซึ่งอยู่ในไดเรกทอรีเดียวกับไฟล์ต้นฉบับ JavaScript ของฉัน

ถ้าผมต้องการที่จะรวมไฟล์ JavaScript requireอีกฉันก็สามารถใช้ ตอนนี้ฉันกำลังใช้readFileSyncและ__dirnameรับ JSON ซึ่งฉันคิดว่าเป็นวิธีที่น่าเกลียดที่จะทำ

มีบางอย่างที่คล้ายกันกับสิ่งที่ต้องการซึ่งทำให้ฉันสามารถโหลดไฟล์ JSON ได้หรือไม่


ดูคำถามที่คล้ายกันนี้: stackoverflow.com/questions/4662851/…
holygeek

@coen คุณหมายถึงอะไรโดย "รวมไฟล์ JSON" อ่านและแยกมันได้หรือไม่ ถ้าใช่อาจเป็นไปได้ซ้ำกัน: stackoverflow.com/questions/5726729/ …
Ciro Santilli 郝海东冠状病病六四事件法轮功

2
ใช่; อ่านและแยกวิเคราะห์ แต่นี่เป็นการอ่านไฟล์โดยเฉพาะซึ่งคล้ายกับการอ่านไฟล์ js ดังนั้นนี่จึงไม่ใช่คำตอบที่ซ้ำกันและคำตอบของ goatslacker ก็ยังใช้ได้
Coen

คำตอบ:


455

ตั้งแต่โหนด v0.5.x ใช่คุณสามารถต้องการ JSON ของคุณได้เช่นเดียวกับที่คุณต้องการไฟล์ js

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

ใน ES6:

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


1
มันเป็นเรื่องจริงเหรอ? มันไม่ทำงานสำหรับฉันและgithub.com/joyent/node/issues/1357และgithub.com/joyent/node/pull/584แนะนำว่าไม่ควร
user161642

12
คุณต้องใช้ require ('./ somefile.json') สมมติว่าไฟล์อยู่ในไดเรกทอรีเดียวกัน (จดบันทึกจุดและสแลช)
Steve Willcock

66
มีหนึ่ง gotcha ด้วยสิ่งนี้ ผลลัพธ์จะถูกแคช! ดังนั้นหากคุณจำเป็นต้องโหลดข้อมูลอีกครั้งด้วยเหตุผลบางอย่าง (พูดที่ cronjob) คุณจะได้ผลลัพธ์เดิมเหมือนกัน
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(หลังเท่านั้นในเวลาเริ่มต้น)

หรือใช้ห้องสมุดที่มีอยู่เช่น

หรือเขียน config ของคุณในไฟล์ js แทนไฟล์ json เช่น

module.exports = {
  // json
}

1
@coen ใช่เรามักใช้__dirnameเพื่อสร้างเส้นทางที่สัมพันธ์กัน
Raynos

วิ่งเข้าไปที่นี่ซึ่งมันจะนำเข้า JSON ในเครื่อง แต่ไม่ได้อยู่ในคอนเทนเนอร์นักเทียบท่าในอินสแตนซ์ EC2 ของฉันใน AWS ... แทนที่จะพยายามกำหนดค่าประเภท mime และสิ่งที่ไม่ฉันเพิ่งเปลี่ยนไปใช้ JS แทน JSON หวังว่านี่อาจช่วยใครซักคน
Erik Grosskurth

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ไม่ควรเปลี่ยนแปลงสิ่งใดในการนำเข้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.