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

Nik*_*dia 128 import json ecmascript-6

如何在Ecmascript 6中访问json文件?以下不起作用:

import config from '../config.json'

如果我尝试导入JavaScript文件,这可以正常工作.

wil*_*mli 84

在ES6/ES2015中,您可以在代码中导入json文件.

// Babel

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

参考文献:

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

  2. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

  • 只需添加到这个(typescript json import),你现在可以简单地将它添加到你的tsconfig ... {"compilerOptions":{"resolveJsonModule":true}} (5认同)
  • 有没有浏览器支持这个?我在当前的FF上尝试了这个并且得到错误`带有源的模块的加载失败"example.json"`; 在Chrome上我得到"无法加载模块脚本:服务器使用非JavaScript MIME类型"application/json"进行响应.对每个HTML规范的模块脚本强制执行严格的MIME类型检查." (4认同)
  • 当我说"任何浏览器都支持这个"时,我并不是说"在通过Babel进行转换后".您链接的第一篇文章有​​TS将`import`语句转换为节点`require()`(试一试!),第二个链接没有说明JSON导入.这里的问题不在于解析器或模块系统,它是*loader* - 浏览器的加载器不能解析其他任何Javascript的导入.在引擎盖下,你总是必须使用AJAX调用(fetch/XHR)并解析结果,即使你的构建工具链将其抽象出来. (3认同)
  • 这只是发生在我身上,当您说“在ES6中”时,您实际上是在“在TS中”。我以为您在谈论的是`tsc`发出*的代码,但实际上并非如此。我正在尝试在浏览器中本机运行ES6模块(<script type =“ module”>`),而如果直接运行该“ import”行,则会出现上述错误。如果我错了,请纠正我,而实际上您的意思是可以在实际的ES6中从JSON导入。 (2认同)

Gil*_*ert 75

一个简单的解决方法:

config.js

export default
{
  // my json here...
}
Run Code Online (Sandbox Code Playgroud)

然后...

import config from '../config.js'
Run Code Online (Sandbox Code Playgroud)

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

  • 这实际上并没有回答这个问题.例如,您不能简单地将package.json转换为package.js. 有时你想要真正导入JSON而不是JS. (121认同)
  • 根本不是解决方案,您导出的javascript对象恰好具有与JSON相同的语法. (12认同)
  • “将其转换为JS”不是如何导入JSON文件的解决方案。那不再是 JSON 文件了。这是关于如何导入 JSON 的 #1 google 结果,主要答案是不导入 JSON。 (9认同)
  • 更新了问题文本;试图避免进一步的语义争论。 (3认同)
  • 将配置放在“.js”文件中更方便,因为您可以在里面添加注释。JSON 文件不支持此功能。 (2认同)

Sim*_*one 57

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

有很多方法可以做到.根据您的需要,您可以查看如何在JavaScript中读取文件(window.FileReader如果您在浏览器中运行,则可以选择)或使用其他问题中描述的其他加载器(假设您使用的是NodeJS).

IMO最简单的方法可能是将JSON作为JS对象放入ES6模块并导出它.这样你就可以在需要的地方导入它.

另外值得注意的是,如果您使用的是Webpack,默认情况下导入JSON文件(从那时起webpack >= v2.0.0).

import config from '../config.json';
Run Code Online (Sandbox Code Playgroud)

  • 没有必要把它放在一个字符串中.毕竟,它被称为JSON,而不是JSSN. (5认同)
  • 实际上ES6/ES2015支持通过导入语法加载JSON:import*作为来自'./example.json'的数据; (5认同)
  • 此外,torazaburo在之前删除的答案中解释说:*没有ES6"模块系统"; 有一个API由特定的加载器实现.任何加载器都可以做任何想做的事情,包括支持导入JSON文件.例如,加载器可能会选择从'./directory支持import foo作为导入目录/ index.js的含义* (4认同)

小智 32

感谢所有提出并实现JSON 模块Import Assertions的人。从Chrome 91开始,可以直接导入JSON,例如:

// test.json
{
    "hello": "world"
}

// Static Import
import json from "./test.json" assert { type: "json" };
console.log(json.hello);

// Dynamic Import
const { default: json } = await import("./test.json", { assert: { type: "json" } });
console.log(json.hello);

// Dynamic Import
import("./test.json", { assert: { type: "json" } })
  .then(module => console.log(module.default.hello));

Run Code Online (Sandbox Code Playgroud)

注意:其他浏览器目前可能尚未实现此功能。


Pat*_*cio 22

根据您的构建工具和 JSON 文件中的数据结构,它可能需要导入default.

import { default as config } from '../config.json';
Run Code Online (Sandbox Code Playgroud)

例如使用范围内 Next.js

  • 为 TypeScript 添加的注释是确保“tsconfig.json”中的“resolveJsonModule”为“true”。 (2认同)

小智 21

我正在使用babel + browserify,我在目录./i18n/locale-en.json中有一个JSON文件,带有翻译命名空间(与ngTranslate一起使用).

无需从JSON文件中导出任何内容(btw不可能),我可以使用以下语法对其内容进行默认导入:

import translationsJSON from './i18n/locale-en';
Run Code Online (Sandbox Code Playgroud)


tru*_*ktr 20

在带有 fetch 的浏览器中(现在基本上都是):

目前,我们不能import使用 JSON mime 类型的文件,只能使用 JavaScript mime 类型的文件。它可能是将来添加的功能(官方讨论)。

fetch('./file.json')
  .then(response => response.json())
  .then(obj => console.log(obj))
Run Code Online (Sandbox Code Playgroud)

在 Node.js v13.2+ 中:

它目前需要--experimental-json-modulesflag,否则默认情况下不支持。

尝试跑步

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

并查看输出到控制台的 obj 内容。


Ano*_*903 11

如果您正在使用节点,则可以:

const fs = require('fs');

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

要么

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

其他:

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

// script.js

import { config } from '../config.js';
Run Code Online (Sandbox Code Playgroud)

要么

import * from '../config.json'
Run Code Online (Sandbox Code Playgroud)

  • ```const config = JSON.parse(fs.readFileSync('../config.json'));``` 对我有用。节点一团糟。 (3认同)
  • 我认为这里 ```const { config } = JSON.parse(fs.readFileSync('../config.json'));``` 错过了参数 'utf8',所以它应该看起来像这样: ```JSON .parse(fs.readFileSync('../package.json', 'utf8')); ```` (2认同)

Avr*_*dor 8

有点晚了,但我在尝试为我的网络应用程序提供分析时偶然发现了同样的问题,该分析涉及基于 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);
  });
Run Code Online (Sandbox Code Playgroud)

请记住,由于我们在这里专门讨论 package.json,因此该文件通常不会捆绑在您的生产构建(甚至开发)中,因此您必须使用 CopyWebpackPlugin 才能访问它在使用 fetch 时。

  • @sapy 回复晚了几个月,但是 fetch API 最绝对*确实*支持从路径加载而不指定服务器的主机名,以及从相对路径加载。您正在考虑的是从 `file:///` URL 加载,这不是这里发生的情况。 (2认同)

new*_*dev 5

只需这样做:

import * as importedConfig from '../config.json';
Run Code Online (Sandbox Code Playgroud)

然后像下面这样使用它:

const config = importedConfig.default;
Run Code Online (Sandbox Code Playgroud)

  • 这在浏览器中本身不起作用,尽管它可能与您似乎使用的任何构建系统(Babel 或其他)结合使用。 (3认同)

GOT*_*O 0 5

除了其他答案之外,在 Node.js 中,甚至可以require在 ES 模块内读取 JSON 文件。我发现这在读取其他包内的文件时特别有用,因为它利用 Node 自己的模块解析策略来定位文件。

requireES 模块中必须首先使用createRequire.

这是一个完整的例子:

import { createRequire } from 'module';

const require = createRequire(import.meta.url);
const packageJson = require('typescript/package.json');
console.log(`You have TypeScript version ${packageJson.version} installed.`);
Run Code Online (Sandbox Code Playgroud)

在安装了 TypeScript 的项目中,上面的代码将从 package.json 中读取并打印 TypeScript 版本号。