Ecmascript 6'da bir json dosyası nasıl alınır?


163

Ecmascript 6'da bir json dosyasına nasıl erişebilirim? Aşağıdakiler işe yaramaz:

import config from '../config.json'

Bir JavaScript dosyasını içe aktarmaya çalışırsam bu işe yarar.


4
Bunun ES6 ile ilgisi yoktur, ancak kullandığınız modül yükleyicisiyle ilgisi yoktur. Sözdiziminin kendisi iyidir.
Felix Kling

2
Bunu yapmanın en temiz yolu kullanmak webpackve json-loaderonunla kullanmaktır .
suprita shankar

11
ES6, aşağıdaki sözdizimiyle JSON içe aktarmayı destekler: import * './example.json' den veri olarak;
williamli

Yanıtlar:


84

Basit bir çözüm:

config.js

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

sonra...

import config from '../config.js'

varolan .json dosyalarının içe aktarılmasına izin vermez, ancak bir iş yapar.


172
Bu aslında soruyu cevaplamıyor. Örneğin package.json'unuzu package.js dosyasına dönüştüremezsiniz. Gerçekten JS değil JSON almak istediğiniz zamanlar vardır.
curiousdannii

23
Hiç bir çözüm değil, JSON ile aynı sözdizimine sahip bir javascript nesnesi dışa aktarıyorsunuz.
Ma Jerez

Sorun metni güncellendi; daha fazla anlamsal tartışmalardan kaçınmaya çalışın.
Gilbert

Benim "postbuild": "node myscript.js"için bunu yapmak için dosya değiştirme kullanan package.json dosyama bir adım ekledim . 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'ye dönüştür" JSON dosyasının nasıl içe aktarılacağı konusunda bir çözüm değildir. Artık JSON dosyası değil. Bu, JSON'u içe aktarma konusunda 1 numaralı google sonucudur ve ana cevap JSON'u içe aktarmamaktır.
Jimbo Jonny

119

TypeScript veya Babel kullanarak , kodunuza json dosyasını alabilirsiniz .

// Babel

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

Referans: https://hackernoon.com/import-json-into-typescript-8d465beded79


13
Sadece buna eklemek için (typescript json import) artık bunu tsconfig'nize ekleyebilirsiniz ... {"compilerOptions": {"solveJsonModule": true}}
Matt Coady

4
Herhangi bir tarayıcı bunu destekliyor mu? Bu geçerli FF denedim ve hatayı alıyorum Loading failed for the module with source "example.json"; Chrome'da "Modül komut dosyası yüklenemedi: Sunucu, JavaScript olmayan bir MIME türü" application / json "ile yanıt verdi. HTML spesifikasyonu başına modül komut dosyaları için katı MIME türü denetimi uygulanır.
Coderer

@Coderer tüm tarayıcılarımda çalışıyor. ES6 / ES2015 desteğini etkinleştirdiniz mi?
williamli

2
Eğer "TS" aslında demek "ES6 içinde" derken sadece, aklıma - Sana kod bahsediyorsun sandım yayılan tarafından tscama bu ne oluyor aslında değil. ES6 modüllerini doğal olarak tarayıcıda ( <script type="module">) çalıştırmaya çalışıyorum ve yukarıdaki hatalar bu importsatırı doğrudan çalıştırırsanız ne elde edeceğinizdir . Lütfen yanılıyorsam beni düzeltin ve aslında gerçek ES6'da JSON'dan içe aktarmanın mümkün olduğunu söylediniz.
Coderer

3
"Herhangi bir tarayıcı bunu destekliyor mu?" Dediğimde, "Babil'den aktardıktan sonra" demek istemedim. Bağladığınız ilk makale TS'nin ifadeyi importbir düğüme aktarmasını sağlar require()(deneyin!) Ve ikinci bağlantı JSON ithalatı hakkında hiçbir şey söylemez. Buradaki sorun ayrıştırıcı veya modül sistemiyle ilgili değil, yükleyici - tarayıcının yükleyicisi Javascript'ten başka bir şey için içe aktarmayı çözmez. Kaputun altında, derleme aracı zinciriniz bunu soyutlasa bile, her zaman bir AJAX çağrısı (getir / XHR) kullanmalı ve sonucu ayrıştırmalısınız.
Coderer

67

Maalesef ES6 / ES2015, modül içe aktarım sözdizimi yoluyla JSON'un yüklenmesini desteklemiyor. Ama ...

Bunu yapmanın birçok yolu var. İhtiyaçlarınıza bağlı olarak JavaScript'te dosyaları nasıl okuyacağınıza bakabilir ( window.FileReadertarayıcıda çalışıyorsanız bir seçenek olabilir) veya diğer sorularda (NodeJS kullandığınız varsayılarak) açıklandığı gibi diğer yükleyicileri kullanabilirsiniz .

IMO'nun en basit yolu muhtemelen JSON'u bir ES6 modülüne JS nesnesi olarak koymak ve dışa aktarmaktır. Böylece ihtiyacınız olan yere aktarabilirsiniz.

Ayrıca Webpack kullanıyorsanız, JSON dosyalarının içe aktarılması varsayılan olarak (beri webpack >= v2.0.0) çalışacaktır .

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

5
Dizgiye koymanıza gerek yoktur. Ne de olsa JSSN değil JSON olarak adlandırılıyor.
daha iyi bir oliver

4
Ayrıca, torazaburo daha önce silinmiş bir cevapta açıkladı: ES6 "modül sistemi" yoktur; belirli bir yükleyici tarafından uygulanan bir API var. Herhangi bir yükleyici, JSON dosyalarının içe aktarılmasını desteklemek de dahil olmak üzere istediği her şeyi yapabilir. Örneğin, bir yükleyici './dizininden içe aktarma
foo'yu

5
aslında ES6 / ES2015, içe aktarma sözdizimi yoluyla JSON'un yüklenmesini destekler: import * './example.json' den veri olarak;
williamli

Web paketinin otomatik olarak yaptığını hatırlatmak için +1. Ancak dikkatli olun, "test: /.js/" web paketiniz varsa json dosyanızı JavaScript olarak derlemeye çalışacaktır. #başarısız. Düzeltmek için "test: /.js$/"
Rap

webpack nodejs tabanlıdır, değil mi?
Ayyash

20

Babel + browserify kullanıyorum ve bir dizinde JSON dosyası var ./i18n/locale-en.json çevirileri ad alanı (ngTranslate ile kullanılacak).

JSON dosyasından (bu btw mümkün değildir) bir şey vermek zorunda kalmadan, bu sözdizimi ile içeriğinin varsayılan bir içe aktarımını yapabilirim:

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

13

Düğüm kullanıyorsanız şunları yapabilirsiniz:

const fs = require('fs');

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

VEYA

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

Başka:

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

// script.js

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

VEYA

import * from '../config.json'

9

Derleme araçlarınıza ve JSON dosyasındaki veri yapısına bağlı olarak default,.

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

örneğin içindeki kullanım Next.js


Typescript not eklendi sağlamaktır resolveJsonModuleolduğunu truesende tsconfig.json.
Pat Migliaccio

1
mükemmel çalıştı! Json'u içe aktarırken ve bir değişkende saklarken, bu çözüm işe yarar.
JP Bala Krishna

1

Biraz geç, ancak web uygulamam için package.json sürümüne dayalı uygulama sürümü göndermeyi içeren analitiği sağlamaya çalışırken aynı sorunla karşılaştım.

Yapılandırma aşağıdaki gibidir: React + Redux, Webpack 3.5.6

Json-loader, Webpack 2+'den beri pek bir şey yapmıyor, bu yüzden onunla uğraştıktan sonra, onu kaldırdım.

Benim için gerçekten işe yarayan çözüm, sadece getirmeyi kullanmaktı. Bu, büyük olasılıkla zaman uyumsuz yaklaşıma uyum sağlamak için bazı kod değişikliklerini zorunlu kılacak olsa da, özellikle getirmenin anında json kod çözme sunacağı göz önüne alındığında mükemmel çalıştı.

İşte burada:

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

Özellikle burada package.json hakkında konuştuğumuzdan, dosyanın genellikle üretim yapınızda (veya bu konu için geliştiriciden) gelmeyeceğini unutmayın, bu nedenle erişebilmek için CopyWebpackPlugin'i kullanmanız gerekecek getirme kullanırken.


Yapamam. Getirme yerel dosyayı desteklemiyor ... Çoklu dolgu veya başka bir şey kullanıyor olabilirsiniz.
sapy

@sapy Aylar geç cevap fakat getirme API en kesinlikle yok göreli yollar sunucunun ana bilgisayar adını, hem de yükleme belirtmeden yollardan destek yükleme. file:///Düşündüğünüz URL'lerden yükleniyor , burada olan şey bu değil.
Jamie Ridding

1

Getirmeli bir tarayıcıda (temel olarak hepsi şimdi):

Şu anda importJSON mime türüne sahip dosyaları değil , yalnızca JavaScript mime türüne sahip dosyaları. Gelecekte eklenen bir özellik olabilir ( resmi tartışma ).

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

Node.js v13.2 + sürümünde:

Şu anda --experimental-json-modulesbayrağı gerektirir , aksi takdirde varsayılan olarak desteklenmez.

Koşmayı dene

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

ve konsola çıkarılan obj içeriğine bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.