Làm cách nào để nhập tệp json trong ecmascript 6?


162

Làm cách nào tôi có thể truy cập tệp json trong Ecmascript 6? Sau đây không hoạt động:

import config from '../config.json'

Điều này hoạt động tốt nếu tôi cố gắng nhập một tệp JavaScript.


4
Điều này không có gì để làm với ES6 nhưng với trình tải mô-đun bạn đang sử dụng. Cú pháp chính nó là tốt.
Felix Kling

2
Cách sạch nhất để làm điều này là sử dụng webpackjson-loadervới nó.
shrar suprita

11
ES6 hỗ trợ nhập JSON theo cú pháp sau: import * dưới dạng dữ liệu từ './example.json';
williamli

Câu trả lời:


84

Một cách giải quyết đơn giản:

config.js

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

sau đó...

import config from '../config.js'

không cho phép nhập các tệp .json hiện có, nhưng thực hiện công việc.


168
Điều này không thực sự trả lời câu hỏi. Ví dụ, bạn không thể chuyển đổi pack.json của bạn thành pack.js. Có những lúc bạn muốn thực sự nhập JSON chứ không phải JS.
Curdannii

23
Hoàn toàn không phải là một giải pháp, bạn đang xuất một đối tượng javascript có cú pháp giống như JSON.
Ma Jerez

Cập nhật văn bản vấn đề; cố gắng để tránh các cuộc tranh luận ngữ nghĩa hơn nữa.
Gilbert

Tôi đã thêm một "postbuild": "node myscript.js"bước trong tệp pack.json sử dụng tệp thay thế để thực hiện việc này cho tôi. 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
"chuyển đổi nó thành JS" không phải là một giải pháp cho cách nhập tệp JSON. Đó không phải là tệp JSON nữa. Đây là kết quả số 1 của google về cách nhập JSON và câu trả lời chính là không nhập JSON.
Jimbo Jonny

119

Trong TypeScript hoặc sử dụng Babel, bạn có thể nhập tệp json trong mã của mình.

// Babel

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

Tham khảo: https://hackernoon.com/import-json-into-typescript-8d465beded79


13
Chỉ cần thêm vào phần này (nhập bản ghi json), giờ đây bạn có thể chỉ cần thêm phần này vào tsconfig của mình ... {"Trình biên dịch": {"notifyJsonModule": true}}
Matt Coady

4
Có trình duyệt nào hỗ trợ điều này không? Tôi đã thử điều này trên FF hiện tại và nhận được lỗi Loading failed for the module with source "example.json"; trên Chrome Tôi nhận được "Không thể tải tập lệnh mô-đun: Máy chủ đã phản hồi với loại" ứng dụng / json "không phải là JavaScript. Kiểm tra loại MIME nghiêm ngặt được thi hành cho các tập lệnh mô-đun cho mỗi thông số HTML."
Bộ giải mã

@Coderer nó hoạt động trên tất cả các trình duyệt của tôi. Bạn có bật hỗ trợ ES6 / ES2015 không?
williamli

2
Nó chỉ xảy ra với tôi, khi bạn nói "trong ES6" bạn thực sự có ý nghĩa "trong TS" - tôi nghĩ bạn đang nói về mã phát ra bởi tscnhưng đó không phải là thực tế những gì đang xảy ra. Tôi đang cố gắng chạy các mô-đun ES6 tự nhiên trên trình duyệt ( <script type="module">) và các lỗi ở trên là những gì bạn nhận được nếu bạn chạy importtrực tiếp dòng đó . Vui lòng sửa lại cho tôi nếu tôi sai và trên thực tế bạn có nghĩa là có thể nhập từ JSON trong ES6 thực tế.
Bộ giải mã

3
Khi tôi nói "Có bất kỳ trình duyệt nào hỗ trợ điều này", tôi không có ý "sau khi bạn chuyển nó qua Babel." Bài viết đầu tiên bạn liên kết có TS dịch mã importcâu lệnh sang một nút require()(thử đi!) Và liên kết thứ hai không nói gì về nhập JSON. Vấn đề ở đây không nằm ở trình phân tích cú pháp hoặc hệ thống mô-đun, đó là trình tải - trình tải của trình duyệt sẽ không giải quyết nhập cho bất kỳ thứ gì khác ngoài Javascript. Trong triển khai, bạn luôn phải sử dụng lệnh gọi AJAX (fetch / XHR) và phân tích kết quả, ngay cả khi chuỗi công cụ xây dựng của bạn trừu tượng hóa điều đó.
Bộ giải mã

67

Thật không may, ES6 / ES2015 không hỗ trợ tải JSON thông qua cú pháp nhập mô-đun. Nhưng ...

Có nhiều cách bạn có thể làm điều đó. Tùy thuộc vào nhu cầu của bạn, bạn có thể xem cách đọc tệp bằng JavaScript ( window.FileReadercó thể là một tùy chọn nếu bạn đang chạy trên trình duyệt) hoặc sử dụng một số trình tải khác như được mô tả trong các câu hỏi khác (giả sử bạn đang sử dụng NodeJS).

Cách đơn giản nhất của IMO có lẽ là chỉ cần đặt JSON làm đối tượng JS vào mô-đun ES6 và xuất nó. Bằng cách đó bạn chỉ có thể nhập nó ở nơi bạn cần.

Cũng đáng lưu ý nếu bạn đang sử dụng Webpack, nhập tệp JSON sẽ hoạt động theo mặc định (kể từ đó webpack >= v2.0.0).

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

5
Không cần phải đặt nó trong Chuỗi. Rốt cuộc, nó được gọi là JSON, không phải JSSN.
một oliver tốt hơn

4
Ngoài ra, torazaburo đã giải thích trong một câu trả lời đã bị xóa trước đó: Không có "hệ thống mô-đun" ES6; có một API được triển khai bởi một trình tải cụ thể. Bất kỳ trình tải nào cũng có thể làm bất cứ điều gì nó muốn, bao gồm hỗ trợ nhập tệp JSON. Chẳng hạn, trình tải có thể chọn hỗ trợ nhập foo từ './directory theo nghĩa là nhập thư mục / index.js
CodingIntrigue

5
trong thực tế ES6 / ES2015 không hỗ trợ tải JSON thông qua cú pháp nhập: nhập * dưới dạng dữ liệu từ './example.json';
williamli

+1 cho lời nhắc rằng webpack sẽ tự động. Mặc dù cẩn thận, nếu bạn có gói web "test: /.js/" sẽ cố gắng biên dịch tệp json của bạn dưới dạng JavaScript. #Thất bại. Để sửa lỗi, hãy đổi nó thành "test: /.js$/"
Rap

webpack dựa trên nodejs, phải không?
Ayyash

20

Tôi đang sử dụng babel + browserify và tôi có một tệp JSON trong một thư mục ./i18n/locale-en.json với không gian tên dịch (sẽ được sử dụng với ngTranslate).

Không phải xuất bất cứ thứ gì từ tệp JSON (mà btw là không thể), tôi có thể thực hiện nhập mặc định nội dung của nó với cú pháp này:

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

13

Nếu bạn đang sử dụng nút, bạn có thể:

const fs = require('fs');

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

HOẶC LÀ

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

Khác:

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

// script.js

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

HOẶC LÀ

import * from '../config.json'

9

Tùy thuộc vào công cụ xây dựng của bạn và cấu trúc dữ liệu trong tệp JSON, nó có thể yêu cầu nhập default.

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

ví dụ như sử dụng trong Next.js


Thêm ghi chú cho TypeScript là để đảm bảo resolveJsonModuletruetrong bạn tsconfig.json.
Pat Migliaccio

1
làm việc hoàn hảo Khi nhập json và lưu trữ nó trong một biến, giải pháp này hoạt động.
JP Bala Krishna

1

Hơi muộn một chút, nhưng tôi vừa vấp phải vấn đề tương tự trong khi cố gắng cung cấp phân tích cho ứng dụng web của mình có liên quan đến việc gửi phiên bản ứng dụng dựa trên phiên bản pack.json.

Cấu hình như sau: React + Redux, Webpack 3.5.6

Trình tải json không hoạt động nhiều kể từ Webpack 2+, vì vậy sau một vài lần nghịch với nó, cuối cùng tôi đã gỡ bỏ nó.

Giải pháp thực sự hiệu quả với tôi, chỉ đơn giản là sử dụng tìm nạp. Mặc dù điều này rất có thể sẽ thực thi một số thay đổi mã để thích ứng với cách tiếp cận không đồng bộ, nhưng nó hoạt động hoàn hảo, đặc biệt là thực tế là việc tìm nạp sẽ cung cấp giải mã json khi đang bay.

Vì vậy, đây là:

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

Xin lưu ý rằng vì chúng ta đang nói về gói.json cụ thể ở đây, nên tệp sẽ không được gói trong bản dựng sản xuất của bạn (hoặc thậm chí là dành cho vấn đề đó), vì vậy bạn sẽ phải sử dụng CopyWebpackPlugin để có quyền truy cập vào nó khi sử dụng tìm nạp.


Không thể. Tìm nạp không hỗ trợ tệp cục bộ ... Bạn có thể đang sử dụng polyfill hoặc một cái gì đó.
buổi sáng

@sapy tháng cuối đáp trả nhưng lấy API hoàn toàn nhất không hỗ trợ tải từ đường dẫn mà không chỉ định tên máy của máy chủ, cũng như tải từ đường dẫn tương đối. Những gì bạn đang nghĩ đến là tải từ file:///URL, đó không phải là những gì đang xảy ra ở đây.
Jamie Ridding

1

Trong trình duyệt có tìm nạp (về cơ bản tất cả chúng bây giờ):

Hiện tại, chúng tôi không thể importcác tệp có loại mime JSON, chỉ các tệp có loại mime JavaScript. Nó có thể là một tính năng được thêm vào trong tương lai ( thảo luận chính thức ).

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

Trong Node.js v13.2 +:

Hiện tại nó yêu cầu --experimental-json-modulescờ , nếu không nó không được hỗ trợ theo mặc định.

Hãy thử chạy

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

và xem nội dung obj xuất ra trên bàn điều khiển.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.