如何在ecmascript 6中导入json文件?


162

如何在Ecmascript 6中访问json文件?以下无效:

import config from '../config.json'

如果我尝试导入JavaScript文件,则效果很好。


4
这与ES6无关,但与您使用的模块加载器有关。语法本身很好。
Felix Kling

2
做到这一点的最干净的方法是使用webpackjson-loader使用它。
suprita shankar '17

11
ES6支持使用以下语法的JSON导入:import *作为来自'./example.json'的数据;
williamli

Answers:


84

一个简单的解决方法:

config.js

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

然后...

import config from '../config.js'

不允许导入现有的.json文件,但可以完成工作。


169
这实际上并不能回答问题。例如,您不能简单地将package.json转换为package.js。有时您想真正地导入JSON而不是JS。
curiousdannii

23
根本不是解决方案,您正在导出的JavaScript对象恰巧具有与JSON相同的语法。
马赫雷斯

更新了问题文本;尝试避免进一步的语义辩论。
吉尔伯特'18

"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文件了。对于如何导入JSON,这是Google排名第一的结果,主要的答案是不导入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”:{“ resolveJsonModule”:true}}
Matt Coady

4
有浏览器支持吗?我在当前FF上尝试过此操作并得到错误Loading failed for the module with source "example.json";在Chrome上,我收到“无法加载模块脚本:服务器以非JavaScript MIME类型“ application / json”响应。根据HTML规范对模块脚本实施了严格的MIME类型检查。”
编码器

@Coderer它可以在我所有的浏览器上使用。是否启用了ES6 / ES2015支持?
williamli

2
它只是发生在我身上,当你“在ES6”你实际上意味着“在TS”说-我还以为你在谈论的代码发出tsc,但实际上并不是发生了什么。我正在尝试在浏览器(<script type="module">)上本机运行ES6模块,而如果import直接运行该行,则会得到上面的错误。如果我错了,请更正我,而实际上您的意思是可以在实际的ES6中从JSON导入。
Coderer

3
当我说“是否有任何浏览器支持此功能”时,我并不是说“通过Babel进行转换之后”。您链接的第一篇文章将TS将该import语句转译到节点上require()(尝试一下!),第二篇链接未提及JSON导入。这里的问题不在于解析器或模块系统,而是加载程序 -浏览器的加载程序无法解析Javascript以外的任何其他内容的导入。在后台,您始终必须使用AJAX调用(访存/ XHR)并解析结果,即使构建工具链将其抽象化了也是如此。
Coderer

67

不幸的是,ES6 / ES2015不支持通过模块导入语法加载JSON。 ...

有很多方法可以做到。根据您的需求,您可以研究如何在JavaScript中读取文件(window.FileReader如果您正在浏览器中运行,则可以选择),也可以使用其他问题中所述的其他加载程序(假设您正在使用NodeJS)。

IMO最简单的方法可能是将JSON作为JS对象放入ES6模块并导出。这样,您就可以将其导入所需的位置。

同样值得注意的是,如果您使用的是Webpack,则默认情况下(因为webpack >= v2.0.0),JSON文件的导入将可以进行

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

5
无需将其放在字符串中。毕竟,它被称为JSON,而不是JSSN。
更好的Oliver,2016年

4
此外,在torazaburo以前删除的答案解释:没有ES6“模块系统”; 有一个由特定加载程序实现的API。任何加载程序都可以做任何想做的事情,包括支持JSON文件的导入。例如,加载程序可能选择支持从'./directory的import foo来导入directory / index.js的含义
CodingIntrigue

5
实际上,ES6 / ES2015确实支持通过导入语法加载JSON:import * as from'./example.json';
williamli

+1提醒您webpack自动执行此操作。但是请小心,如果您有“ test:/.js/”,webpack将尝试将您的json文件编译为JavaScript。#失败。要修复它,改变它说“测试:/.js$/”
说唱

webpack是基于nodejs的,不是吗?
阿亚什

20

我正在使用babel + browserify,并且我在目录./i18n/locale-en.json中有一个JSON文件,带有翻译名称空间(与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


为打字稿补充说明是保证resolveJsonModuletruetsconfig.json
Pat Migliaccio

1
工作完美!导入json并将其存储在变量中时,此解决方案有效。
JP Bala克里希纳

1

有点晚了,但是当我尝试为我的Web应用程序提供涉及基于package.json版本发送应用程序版本的分析时,我偶然发现了同一问题。

配置如下:React + Redux,Webpack 3.5.6

自从Webpack 2+以来,json-loader并没有做太多事情,所以在摆弄它之后,我最终将其删除。

实际上对我有用的解决方案只是使用fetch。尽管这很可能会强制执行一些代码更改以适应异步方法,但它的运行效果非常好,特别是考虑到fetch可以即时提供json解码的事实。

所以这里是:

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

请记住,由于我们在这里专门讨论package.json,因此该文件通常不会捆绑在您的生产版本中(甚至是开发包),因此您必须使用CopyWebpackPlugin来访问使用提取时将其保存。


不行 提取不支持本地文件...您可能正在使用polyfill或其他东西。
Sapy

@sapy月中下旬答复,但获取API最绝对支持加载从路径没有指定的服务器从相对路径的主机名,以及加载。您正在考虑的是从file:///URL 加载,而不是在这里发生。
杰米·里丁

1

在具有抓取功能的浏览器中(基本上现在都是):

目前,我们不能import使用JSON MIME类型的文件,而只能使用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内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.