วิธีการนำเข้าไฟล์ json ใน ecmascript 6


162

ฉันจะเข้าถึงไฟล์ json ใน Ecmascript 6 ได้อย่างไร ต่อไปนี้ใช้ไม่ได้:

import config from '../config.json'

สิ่งนี้ใช้ได้ดีถ้าฉันพยายามนำเข้าไฟล์ JavaScript


4
สิ่งนี้ไม่เกี่ยวกับ ES6 แต่กับตัวโหลดโมดูลที่คุณกำลังใช้ ไวยากรณ์เองไม่เป็นไร
เฟลิกซ์คลิง

2
วิธีที่สะอาดที่สุดในการทำเช่นนี้คือการใช้งานwebpackและjson-loaderด้วย
suprita shankar

11
ES6 รองรับการนำเข้า JSON ด้วยไวยากรณ์ต่อไปนี้: import * as data from './example.json';
williamli

คำตอบ:


84

วิธีแก้ปัญหาง่ายๆ:

config.js

export default
{
  // my json here...
}

แล้ว ...

import config from '../config.js'

ไม่อนุญาตให้นำเข้าไฟล์. json ที่มีอยู่ แต่ทำงาน


170
นี่ไม่ได้ตอบคำถามจริงๆ คุณไม่สามารถแปลง package.json ของคุณเป็น package.js ได้ มีหลายครั้งที่คุณต้องการนำเข้า JSON ไม่ใช่ JS อย่างแท้จริง
อยากรู้อยากเห็น dannii

23
ไม่ใช่วิธีแก้ปัญหาเลยคุณกำลังส่งออกวัตถุจาวาสคริปต์ซึ่งมีไวยากรณ์เหมือนกับ JSON
Ma Jerez

อัปเดตข้อความปัญหา พยายามหลีกเลี่ยงการอภิปรายเชิงความหมายเพิ่มเติม
Gilbert

ฉันได้เพิ่ม"postbuild": "node myscript.js"ขั้นตอนในไฟล์ package.json ของฉันซึ่งใช้ replace-in-file เพื่อทำสิ่งนี้ให้ฉัน myscript.js ­ const replace = require('replace-in-file'); const options = { files: '_demo/typedocs/navexReact.td.js', from: /{/, to: 'export default {', }; const convertJsonOutputToJsModule = async () => { try { const changes = await replace(options) console.log('Converted json to module in files:', changes.join(', ')); } catch (error) { console.error('Error occurred:', error); } } convertJsonOutputToJsModule()
StJohn3D

1
"แปลงเป็น JS" ไม่ใช่วิธีแก้ปัญหาสำหรับการนำเข้าไฟล์ JSON นั่นไม่ใช่ไฟล์ JSON อีกต่อไป นี่เป็นผลลัพธ์ # 1 ของ Google สำหรับวิธีนำเข้า JSON และคำตอบหลักคือไม่ต้องนำเข้า JSON
Jimbo Jonny

119

ใน TypeScript หรือใช้ Babel คุณสามารถนำเข้าไฟล์jsonในรหัสของคุณ

// Babel

import * as data from './example.json';
const word = data.name;
console.log(word); // output 'testing'

การอ้างอิง: https://hackernoon.com/import-json-into-typescript-8d465beded79


13
เพียงเพิ่มไปยังสิ่งนี้ (นำเข้า typescript json) ตอนนี้คุณสามารถเพิ่มสิ่งนี้ลงใน tsconfig ของคุณ ... {"compilerOptions": {"resolJsonModule": true}}
Matt Coady

4
เบราว์เซอร์ใดบ้างที่รองรับสิ่งนี้ ฉันลองสิ่งนี้กับ FF ปัจจุบันและรับข้อผิดพลาดLoading failed for the module with source "example.json"; ใน Chrome ฉันได้รับ "ไม่สามารถโหลดสคริปต์โมดูล: เซิร์ฟเวอร์ตอบกลับด้วย" application / json "ประเภท MIME ที่ไม่ใช่ JavaScript การตรวจสอบประเภท MIME ที่เข้มงวดถูกบังคับใช้สำหรับสคริปต์โมดูลต่อสเป็ค HTML
Coderer

@Coderer ใช้งานได้กับทุกเบราว์เซอร์ของฉัน คุณเปิดใช้งานการสนับสนุน ES6 / ES2015 หรือไม่
williamli

2
มันก็เกิดขึ้นกับผมเมื่อคุณพูดว่า "ใน ES6" คุณจริงหมายถึง "ใน TS" - ฉันคิดว่าคุณมีการพูดคุยเกี่ยวกับโค้ดที่ปล่อยออกมาโดยtscแต่ที่ไม่จริงสิ่งที่เกิดขึ้น ฉันกำลังพยายามเรียกใช้โมดูล ES6 ที่เบราว์เซอร์ ( <script type="module">) และข้อผิดพลาดข้างต้นคือสิ่งที่คุณจะได้รับหากคุณเรียกใช้importบรรทัดนั้นโดยตรง โปรดแก้ไขให้ฉันถ้าฉันผิดและคุณทำจริงหมายความว่าเป็นไปได้ที่จะนำเข้าจาก JSON ใน ES6 จริง
Coderer

3
เมื่อฉันพูดว่า "เบราว์เซอร์ใด ๆ ที่สนับสนุนสิ่งนี้" ฉันไม่ได้ตั้งใจ "หลังจากที่คุณส่งผ่าน Babel" บทความแรกที่คุณเชื่อมโยงมี TS transpiling importคำสั่งไปยังโหนดrequire()(ลองใช้!) และลิงค์ที่สองพูดว่าไม่มีอะไรเกี่ยวกับการนำเข้า JSON ปัญหาที่นี่ไม่ได้อยู่กับตัวแยกวิเคราะห์หรือระบบโมดูลมันเป็นตัวโหลด - ตัวโหลดของเบราว์เซอร์จะไม่แก้ไขการนำเข้าสำหรับสิ่งอื่นใดที่ Javascript ภายใต้ประทุนคุณจะต้องใช้การเรียก AJAX (fetch / XHR) เสมอและแยกผลลัพธ์แม้ว่าการสร้าง toolchain ของคุณจะหายไป
Coderer

67

น่าเสียดายที่ ES6 / ES2015 ไม่รองรับการโหลด JSON ผ่านทางไวยากรณ์การนำเข้าโมดูล แต่ ...

มีหลายวิธีที่คุณสามารถทำได้ ขึ้นอยู่กับความต้องการของคุณคุณสามารถดูวิธีการอ่านไฟล์ใน JavaScript ( window.FileReaderอาจเป็นตัวเลือกหากคุณใช้งานในเบราว์เซอร์) หรือใช้ตัวโหลดอื่น ๆ ตามที่อธิบายไว้ในคำถามอื่น ๆ (สมมติว่าคุณใช้ NodeJS)

IMO วิธีที่ง่ายที่สุดน่าจะเป็นเพียงแค่วาง JSON เป็นวัตถุ JS ลงในโมดูล ES6 และส่งออก ด้วยวิธีนี้คุณสามารถนำเข้าได้ตามที่คุณต้องการ

นอกจากนี้ยังควรระวังหากคุณใช้ Webpack การอิมพอร์ตไฟล์ JSON จะทำงานตามค่าเริ่มต้น (ตั้งแต่webpack >= v2.0.0)

import config from '../config.json';

5
ไม่จำเป็นต้องใส่ใน String มันเรียกว่า JSON ไม่ใช่ JSSN หลังจากทั้งหมด
ที่ดีกว่า

4
Torazaburo อธิบายด้วยคำตอบที่ถูกลบไปก่อนหน้านี้: ไม่มีระบบโมดูล "ES6"; มี API ซึ่งถูกใช้งานโดยตัวโหลดเฉพาะ ตัวโหลดใด ๆ สามารถทำสิ่งที่ต้องการรวมถึงสนับสนุนการนำเข้าไฟล์ JSON ตัวอย่างเช่นตัวโหลดอาจเลือกที่จะสนับสนุนการนำเข้า foo จาก './directory เป็นความหมายในการนำเข้าไดเรกทอรี / index.js
CodingIntrigue

5
ในความเป็นจริง ES6 / ES2015 รองรับการโหลด JSON ผ่านทางไวยากรณ์การนำเข้า: import * เป็นข้อมูลจาก './example.json';
williamli

+1 เพื่อเตือนว่า webpack ทำโดยอัตโนมัติ แต่ระวังหากคุณมี "test: /.js/" webpack จะพยายามรวบรวมไฟล์ json ของคุณเป็น JavaScript #ล้มเหลว. หากต้องการแก้ไขให้เปลี่ยนเป็น "test: /.js$/"
Rap

webpack เป็นพื้นฐานของ nodejs ใช่ไหม?
Ayyash

20

ฉันใช้ babel + browserify และฉันมีไฟล์ JSON ในไดเรกทอรี. / i18n/locale-en.json พร้อม namespace การแปล (เพื่อใช้กับ ngTranslate)

โดยไม่ต้องส่งออกอะไรจากไฟล์ JSON (ซึ่งเป็นไปไม่ได้ btw) ฉันสามารถสร้างการนำเข้าเริ่มต้นของเนื้อหาด้วยไวยากรณ์นี้:

import translationsJSON from './i18n/locale-en';

13

หากคุณใช้โหนดคุณสามารถ:

const fs = require('fs');

const { config } = JSON.parse(fs.readFileSync('../config.json', 'utf8')) // May be incorrect, haven't used fs in a long time

หรือ

const evaluation = require('../config.json');
// evaluation will then contain all props, so evaluation.config
// or you could use:
const { config } = require('../config.json');

อื่น:

// config.js
{
// json object here
}

// script.js

import { config } from '../config.js';

หรือ

import * from '../config.json'

9

ทั้งนี้ขึ้นอยู่กับการสร้างเครื่องมือและโครงสร้างข้อมูลภายในแฟ้ม JSON defaultของคุณก็อาจต้องนำเข้า

import { default as config } from '../config.json';

เช่นการใช้งานภายใน Next.js


เพิ่มโน้ตสำหรับ typescript คือการจัดให้resolveJsonModuleเป็นในตัวคุณtrue tsconfig.json
Pat Migliaccio

1
ทำงานได้อย่างสมบูรณ์แบบ! เมื่ออิมพอร์ต json และเก็บไว้ในตัวแปรโซลูชันนี้จะทำงาน
JP Bala Krishna

1

ช้าไปหน่อย แต่ฉันเพิ่งเจอปัญหาเดียวกันในขณะที่พยายามให้การวิเคราะห์แอปพลิเคชันเว็บของฉันที่เกี่ยวข้องกับการส่งเวอร์ชันของแอปตามเวอร์ชัน package.json

การกำหนดค่ามีดังนี้: React + Redux, Webpack 3.5.6

ตัวโหลด json ไม่ได้ทำอะไรมากมายตั้งแต่ Webpack 2+ ดังนั้นหลังจากเล่นซอมันฉันก็เลยเอามันออก

วิธีแก้ปัญหาที่ใช้งานได้จริงสำหรับฉันคือการใช้การดึง แม้ว่านี่อาจจะบังคับให้มีการเปลี่ยนแปลงรหัสบางอย่างเพื่อปรับให้เข้ากับวิธีการแบบอะซิงก์ แต่มันก็ทำงานได้อย่างสมบูรณ์แบบ

ดังนั้นนี่คือ:

  fetch('../../package.json')
  .then(resp => resp.json())
  .then((packageJson) => {
    console.log(packageJson.version);
  });

โปรดจำไว้ว่าเนื่องจากเรากำลังพูดถึง package.json โดยเฉพาะที่นี่ไฟล์มักจะไม่รวมอยู่ในบิลด์การผลิตของคุณ (หรือแม้แต่ dev สำหรับเรื่องนั้น) ดังนั้นคุณจะต้องใช้ CopyWebpackPlugin เพื่อเข้าถึง เมื่อใช้การดึงข้อมูล


ลาด. การดึงข้อมูลไม่รองรับไฟล์ในตัวเครื่อง ... คุณอาจใช้โพลีฟิลหรือบางสิ่ง
sapy

@sapy เดือนปลายตอบ แต่ดึงข้อมูล API มากที่สุดอย่างไม่โหลดการสนับสนุนจากเส้นทางโดยไม่ต้องระบุชื่อโฮสต์ของเซิร์ฟเวอร์เช่นเดียวกับการโหลดจากทางญาติ สิ่งที่คุณกำลังคิดคือการโหลดจากfile:///URL ซึ่งไม่ใช่สิ่งที่เกิดขึ้นที่นี่
Jamie Ridding

1

ในเบราว์เซอร์ที่มีการดึงข้อมูล (โดยพื้นฐานแล้วทั้งหมดนี้):

ในขณะนี้เราไม่สามารถimportไฟล์ที่มีประเภท mime ของ JSON ได้เฉพาะไฟล์ที่มีประเภท JavaScript mime มันอาจจะเป็นคุณสมบัติที่เพิ่มเข้ามาในอนาคต ( การสนทนาอย่างเป็นทางการ )

fetch('./file.json')
  .then(response => response.json())
  .then(obj => console.log(obj))

ใน Node.js v13.2 +:

ขณะนี้ต้องใช้การ--experimental-json-modulesตั้งค่าสถานะมิฉะนั้นจะไม่ได้รับการสนับสนุนตามค่าเริ่มต้น

ลองวิ่ง

node --input-type module --experimental-json-modules --eval "import obj from './file.json'; console.log(obj)"

และดูเนื้อหา obj แสดงผลไปยังคอนโซล

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