ECMAScript 6でjsonファイルをインポートする方法


162

Ecmascript 6でjsonファイルにアクセスするにはどうすればよいですか?以下は機能しません:

import config from '../config.json'

JavaScriptファイルをインポートしようとすると、これは正常に機能します。


4
これはES6とは関係ありませんが、使用しているモジュールローダーを使用します。構文自体は問題ありません。
Felix Kling 2016年

2
これを行う最もクリーンな方法は、それを使用webpackして使用json-loaderすることです。
suprita shankar 2017

11
ES6は、次の構文でJSONインポートをサポートしています。
williamli

回答:


84

簡単な回避策:

config.js

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

その後...

import config from '../config.js'

既存の.jsonファイルのインポートは許可されませんが、ジョブは実行されます。


168
これは実際には質問の答えにはなりません。たとえば、package.jsonを単にpackage.jsに変換することはできません。JSではなくJSONを本当にインポートしたい場合があります。
curiousdannii

23
まったく解決策ではありません。たまたまJSONと同じ構文を持つJavaScriptオブジェクトをエクスポートしています。
Maヘレス

問題のテキストを更新しました。これ以上の意味論的な議論を回避しようとする。
ギルバート

"postbuild": "node myscript.js"これを行うためにreplace-in-fileを使用するパッケージ.jsonファイルにステップを追加しました。 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 2018年

1
「JSに変換」は、JSONファイルをインポートする方法のソリューションではありません。それはもはやJSONファイルではありません。これは、JSONをインポートする方法の#1グーグル結果であり、主な答えはJSONをインポートしないことです。
神保ジョニー

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 import)に追加するだけで、これをtsconfigに追加できます... {"compilerOptions":{"resolveJsonModule":true}}
Matt Coady

4
これをサポートするブラウザはありますか?現在のFFでこれを試してみたところ、エラーが発生しましたLoading failed for the module with source "example.json"。Chromeで「モジュールスクリプトの読み込みに失敗しました:サーバーがJavaScript以外のMIMEタイプ "application / json"で応答しました。HTML仕様ごとにモジュールスクリプトに厳密なMIMEタイプチェックが適用されています。」
Coderer 2018

@Codererそれは私のすべてのブラウザで動作します。ES6 / ES2015サポートが有効になっていますか?
williamli 2018

2
「ES6で」と言うと、実際には「TSで」を意味します- によって発行さtscたコードについて話していると思いましたが、実際には何が起こっているのかはわかりません。ブラウザでネイティブでES6モジュールを実行しようとしています(<script type="module">import。その行を直接実行すると、上記のエラーが発生します。私が間違っていて、実際に実際のES6でJSONからインポートできることを意味していた場合は、修正してください。
Coderer 2018

3
「どのブラウザでもこれをサポートしていますか」と言ったとき、「バベルでトランスパイルした後」という意味ではありませんでした。最初にリンクした記事importには、ノードへのステートメントのTSトランスパイルがありますrequire()(試してみてください)。2番目のリンクは、JSONインポートについては何も述べていません。ここでの問題は、パーサーやモジュールシステムではなく、ローダーです。ブラウザーのローダーは、JavaScript以外のインポートを解決しません。内部では、たとえビルドツールチェーンが抽象化しても、常にAJAX呼び出し(フェッチ/ XHR)を使用して結果を解析する必要があります。
Coderer 2018

67

残念ながら、ES6 / ES2015はモジュールのインポート構文によるJSONのロードをサポートしていません。しかし ...

あなたがそれを行うことができる多くの方法があります。ニーズに応じて、JavaScriptでファイルを読み取る方法(window.FileReaderブラウザで実行している場合はオプションになる場合があります)を調べるか、他の質問で説明されているようにのローダーを使用できます(NodeJSを使用していると想定しています)。

IMOの最も簡単な方法は、おそらくJSONをJSオブジェクトとしてES6モジュールに入れ、それをエクスポートすることです。そうすれば、必要な場所にインポートできます。

また、Webpackを使用している場合、JSONファイルのインポートはデフォルトで機能します(以降webpack >= v2.0.0)。

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

5
文字列に入れる必要はありません。結局のところ、これはJSSNではなくJSONと呼ばれます。
より良いオリーブ

4
また、トラザブロは以前に削除された答えで説明しました:ES6「モジュールシステム」はありません。特定のローダーによって実装されるAPIがあります。ローダーは、JSONファイルのインポートのサポートを含め、必要なすべてを実行できます。たとえば、ローダーは、ディレクトリ/index.jsをインポートする意味として、 '。/ directoryからのインポートfooのサポートを選択する場合があります
CodingIntrigue

5
実際、ES6 / ES2015はインポート構文によるJSONのロードをサポートします:import * as './example.json';
williamli

+1は、webpackが自動的に行うことを思い出させます。ただし、「test:/.js/」がある場合、webpackはjsonファイルをJavaScriptとしてコンパイルしようとします。#不合格。それを修正するには、「テスト:/.js$/」と言って、それを変更する
ラップ

webpackはnodejsに基づいていますね。
Ayyash

20

私はbabel + browserifyを使用していて、ディレクトリ./i18n/locale-en.jsonにJSONファイルがあり、translations名前空間(ngTranslateで使用される)が含まれています。

JSONファイルから何かをエクスポートする必要はありませんが(これは不可能です)、次の構文でコンテンツのデフォルトのインポートを作成できます。

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


活字体のための追加されたノートが確保することであるresolveJsonModuleであるtrueあなたにtsconfig.json
Pat Migliaccio、

1
完璧に働いた!jsonをインポートして変数に格納すると、このソリューションが機能します。
JPバラクリシュナ

1

少し遅れましたが、package.jsonバージョンに基づいてアプリのバージョンを送信することを含むWebアプリの分析を提供しようとしているときに、同じ問題に遭遇しました。

構成は次のとおりです。React+ Redux、Webpack 3.5.6

json-loaderはWebpack 2+以降はあまり機能していないため、少しいじってから削除しました。

私にとって実際に機能したソリューションは、単にフェッチを使用することでした。これはおそらく非同期アプローチに適応するためにいくつかのコード変更を強制しますが、特にフェッチがオンザフライでjsonデコードを提供するという事実を考えると、それは完全に機能しました。

だからここにあります:

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

ここでは特にpackage.jsonについて説明しているため、ファイルは通常、本番ビルド(または、その場合はdev)にバンドルされないため、CopyWebpackPluginを使用してアクセスする必要があることに注意してください。フェッチを使用する場合は、


できません。Fetchはローカルファイルをサポートしていません...ポリフィルなどを使用している可能性があります。
sapy

@sapyヶ返事が遅れますが、APIをフェッチは、ほとんど絶対にないサーバーのホスト名だけでなく、相対パスからロードを指定せずにパスからのサポートの負荷を。あなたが考えているのはfile:///URL からロードすることです、それはここで起こっていることではありません。
ジェイミーライディング

1

フェッチ付きのブラウザで(基本的には現在、それらすべて):

現時点ではimport、JSON MIMEタイプのファイルは作成できません。JavaScriptMIMEタイプのファイルのみです。将来的に追加される機能かもしれません(公式ディスカッション)。

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.