如何将JSON文件导入TypeScript文件?


86

我正在使用Angular Maps构建地图应用程序,并希望导入JSON文件作为定义位置的标记列表。我希望将此JSON文件用作app.component.ts中的marker []数组。而不是在TypeScript文件中定义标记的硬编码数组。

导入此JSON文件以在我的项目中使用的最佳过程是什么?任何方向都非常感谢!


您可以看到我的答案,因为它适用于Angular 7+
Yulian

Answers:


115

直到最近的打字稿更新之前,Aonepathan的单行代码都为我工作。

我发现Jecelyn Yeen的帖子建议将该代码段发布到您的TS定义文件中

将文件添加typings.d.ts到具有以下内容的项目的根文件夹中

declare module "*.json" {
    const value: any;
    export default value;
}

然后像这样导入您的数据:

import * as data from './example.json';

2019年7月更新:

Typescript 2.9(docs)引入了更好,更智能的解决方案。脚步:

  1. resolveJsonModuletsconfig.json文件中添加以下行支持:
"compilerOptions": {
    ...
    "resolveJsonModule": true
  }

import语句现在可以假定默认导出:

import data from './example.json';

并且intellisense现在将检查json文件,以查看是否可以使用Array等方法。很酷


3
这也对我有用-超级光滑!注意:您需要重新启动开发服务器才能正确编译。
Scott Byers

13
我得到Cannot find module '*.json'. Consider using '--resolveJsonModule' to import module with '.json' extensionts(2732)
杰里米·蒂尔

4
我需要还加"esModuleInterop": true,如了打字稿文档指定的,但是他们也说使用commonjs作为module代替esnext。这似乎与任何一个。是否有任何理由反对坚持使用esnext的默认设置(如文档中所述)切换到commonjs?
timhc22

1
和我需要的评论一样"esModuleInterop":true。VS代码仍然向我显示错误..但一切正常
mikey

6
我不得不添加"allowSyntheticDefaultImports": truecompilerOptions,以及用新鲜的角度9.1.11项目。
yohosuff

28

本reddit文章所述,在Angular 7之后,您可以将事情简化为以下两个步骤:

  1. 添加这些三行compilerOptionstsconfig.json文件中:
"resolveJsonModule": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
  1. 导入您的json数据:
import myData from '../assets/data/my-data.json';

就是这样。您现在可以myData在组件/服务中使用。


esModuleInterop为了什么?
giovannipds

@giovannipds这是默认的json导入
Vasia Zaretskyi

25

这是基于@ryanrain答案的Angular 6+的完整答案:

angular-cli doc中,可以将json视为资产,可以通过标准导入访问json,而无需使用ajax请求。

假设您将json文件添加到“ your-json-dir”目录中:

  1. 将“ your-json-dir”添加到angular.json文件中(:

    "assets": [ "src/assets", "src/your-json-dir" ]

  2. 在您的项目根目录下创建或编辑Types.d.ts文件,并添加以下内容:

    declare module "*.json" { const value: any; export default value; }

    这将允许导入“ .json”模块而不会出现打字稿错误。

  3. 在控制器/服务/其他任何文件中,只需使用以下相对路径导入文件:

    import * as myJson from 'your-json-dir/your-json-file.json';


3
如果没有types.d.ts文件怎么办?
克里斯托弗·温莎

2
那么您只需要在项目根目录中创建一个仅包含第2步的内容
Benjamin Caure

2
重要说明:将自定义键入文件添加到tsconfig.json“ typeRoots”中的typeRoots:[“ node_modules / @ types”,“ src / typings.d.ts”],
Japo Domingo

22

感谢您的投入,我能够找到此修复程序,我在app.component.ts文件顶部添加并定义了json:

var json = require('./[yourFileNameHere].json');

最终产生了标记,并且是简单的代码行。


6
error TS2304: Cannot find name 'require'.通过添加来解决declare var require: any;,如问题stackoverflow.com/questions/43104114/…的可接受答案的注释中所述。

4
@Ben,您需要将节点类型添加到tsconfig中。即"compilerOptions": { ... "types": ["node"] },这是那些需要它的人的相关答案:stackoverflow.com/a/35961176/1754995
Kody

嗨@aonepathan,希望您能对我有所帮助:我有一个使用require读取json文件的库。var json = require('./[yourFileNameHere]');没有扩展名。在编译时我遇到一个错误:Module not found: Error: Can't resolve [yourFileNameHere] in [file name]您是否有任何想法可以绕过此问题?
Neo1975 '20

16

第一个解决方案-只需将.json文件的扩展名更改为.ts并export default在文件的开头添加即可,如下所示:

export default {
   property: value;
}

然后,您只需导入文件即可,而无需添加类型,如下所示:

import data from 'data';

第二种解决方案通过HttpClient获取json。

将HttpClient注入您的组件,如下所示:

export class AppComponent  {
  constructor(public http: HttpClient) {}
}

然后使用以下代码:

this.http.get('/your.json').subscribe(data => {
  this.results = data;
});

https://angular.io/guide/http

此解决方案比此处提供的其他解决方案有一个明显的发现-如果您的json会更改(它从一个单独的文件动态加载,因此您只能修改该文件),则不需要重建整个应用程序。


1
如果您的数据是静态的并且不会在很长时间内发生变化,则第一种解决方案是好的;它将为您节省不必要的http请求,但如果此数据不断变化,则使用服务器发送的第二个解决方案,或者如果数据集很大,则考虑将其添加到数据库中
OzzyTheGiant

10

我已经阅读了一些回复,但它们似乎对我没有用。我正在使用Typescript 2.9.2,Angular 6,并尝试在Jasmine单元测试中导入JSON。这就是我的诀窍。

加:

"resolveJsonModule": true,

tsconfig.json

像这样导入:

import * as nameOfJson from 'path/to/file.json';

停止ng test,然后重新开始。

参考:https : //blogs.msdn.microsoft.com/typescript/2018/05/31/announcing-typescript-2-9/#json-imports


1
这对我来说是最好的解决方案。无分型文件所需,TS可以解决该房产的名称为您服务。
史蒂夫·霍布斯

7

对于Angular 7+,

1)将文件“ typings.d.ts”添加到项目的根文件夹(例如src / typings.d.ts):

declare module "*.json" {
    const value: any;
    export default value;
}

2)导入和访问JSON数据:

import * as data from 'path/to/jsonData/example.json';
...
export class ExampleComponent {
    constructor() {
        console.log(data.default);
    }

}

要么:

import data from 'path/to/jsonData/example.json';
...
export class ExampleComponent {
    constructor() {
        console.log(data);
    }

}

data.default使我挂断电话。感谢完整的示例!
kevin_fitz

请注意json文件的路径,因为它与您导入文件的文件有关,例如,如果您在src/app/services/文件夹中有服务,而您的json在src/assets/data/文件夹中,则必须像这样指定它../../assets/data/your.json
Adam Boczek,

它可以完美运行,但是为什么需要types.d.ts文件?
罗伯特

5

在angular7中,我只是使用了

let routesObject = require('./routes.json');

我的routes.json文件看起来像这样

{

    "routeEmployeeList":    "employee-list",
    "routeEmployeeDetail":      "employee/:id"
}

您使用访问json项目

routesObject.routeEmployeeList

而已!;-)所有其他选项都很骇人!如果您有TSLint将会抛出reuqire错误-只需declare var require: any;在类组件的顶部添加即可。
Pedro Ferreira

5

Typescript 2.9开始,您可以简单地添加:

"compilerOptions": {
    "resolveJsonModule": true
}

tsconfig.json。此后,它很容易使用JSON文件(会出现在VSCode不错的类型推断,太):

data.json

{
    "cases": [
        {
            "foo": "bar"
        }
    ]
}

在您的打字稿文件中:

import { cases } from './data.json';



2

角度10

您现在应该改为编辑tsconfig.app.json(注意名称中的“ app”)文件。

您将在其中找到compilerOptions,然后只需添加即可resolveJsonModule: true

因此,例如,一个全新项目中的文件应如下所示:

/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "outDir": "./out-tsc/app",
    "types": [],
    "resolveJsonModule": true
  },
  "files": [
    "src/main.ts",
    "src/polyfills.ts"
  ],
  "include": [
    "src/**/*.d.ts"
  ]
}
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.