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

aon*_*han 45 maps json google-maps typescript angular

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

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

rya*_*ain 56

Aonepathan的单行为我工作,直到最近的打字稿更新.

我找到了Jecelyn Yeen的帖子,建议将此片段发布到您的TS定义文件中

typings.d.ts

然后导入您的数据,如下所示:

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

  • 我必须在 `compilerOptions` 中添加 `"allowSyntheticDefaultImports": true` 以及新的 Angular 9.1.11 项目。 (8认同)
  • 我还需要添加`"esModuleInterop": true,`,如打字稿文档中指定的那样,但是他们也说使用`commonjs`作为`module`而不是`esnext`。这似乎适用于任何一个。是否有任何理由切换到 commonjs (如文档中所述)而不是坚持使用 esnext 的默认值? (6认同)
  • 我得到`找不到模块'* .json'。考虑使用'--resolveJsonModule'导入扩展名为'.json'的模块(2732)` (4认同)
  • 这也对我有用-超级光滑!注意:您需要重新启动开发服务器才能正确编译。 (2认同)
  • 与上面的评论相同,我需要 `"esModuleInterop":true`。另外 VS code 仍然显示错误..但一切正常 (2认同)
  • 此更改打破了“import * as moment from 'moment'”语句。将其更改为“从‘时刻’导入时刻”有效。此外,还需要重新启动 VS Code。 (2认同)

Ben*_*ure 21

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

angular-cli doc,json可以被视为资产,可以在不使用ajax请求的情况下从标准导入访问.

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

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

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

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

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

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

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

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

  • 如果我没有typings.d.ts文件怎么办? (3认同)
  • 那么你必须在你的项目根目录中创建一个只有第2步的内容 (2认同)
  • 重要说明:在tsconfig.json"typeRoots"中将自定义类型文件添加到typeRoots:["node_modules/@ types","src/typings.d.ts"], (2认同)

aon*_*han 19

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

var json = require('./[yourFileNameHere].json');
Run Code Online (Sandbox Code Playgroud)

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

  • 我得到了`错误TS2304:找不到名字'require'.解决方法是添加`declare var require:any;`,如问题/sf/ask/3017288011/的接受答案的评论中所述-name-需要,后升级到angular4/43122829. (6认同)
  • @Ben,您需要将节点类型添加到tsconfig中。即`“ compilerOptions”:{...“ types”:[“ node”]},`这是那些需要它的人的相关答案:/sf/answers/2517282351/ (2认同)

vic*_*yte 13

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

export default {
   property: value;
}
Run Code Online (Sandbox Code Playgroud)

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

import data from 'data';
Run Code Online (Sandbox Code Playgroud)

第二个解决方案通过HttpClient获取json.

将HttpClient注入到组件中,如下所示:

export class AppComponent  {
  constructor(public http: HttpClient) {}
}
Run Code Online (Sandbox Code Playgroud)

然后使用此代码:

this.http.get('/your.json').subscribe(data => {
  this.results = data;
});
Run Code Online (Sandbox Code Playgroud)

https://angular.io/guide/http

此解决方案明显优于此处提供的其他解决方案 - 如果您的json将更改(它是从单独的文件动态加载,因此您只能修改该文件),它不需要您重建整个应用程序.

  • 如果您的数据是静态的并且在很长一段时间内不会改变,那么第一个解决方案是好的;它将为您节省不必要的http请求,但如果此数据不断变化,则使用服务器发送的第二种解决方案,如果数据集很大,甚至可以考虑将其添加到数据库中 (2认同)

Nig*_*ert 9

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

"compilerOptions": {
    "resolveJsonModule": true
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.json. 此后,使用 json 文件很容易(而且VSCode 中也会有很好的类型推断):

data.json

{
    "cases": [
        {
            "foo": "bar"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

在您的打字稿文件中:

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


Yul*_*ian 9

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

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

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


Ian*_*son 8

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

加:

"resolveJsonModule": true,
Run Code Online (Sandbox Code Playgroud)

tsconfig.json

像这样导入:

import * as nameOfJson from 'path/to/file.json';
Run Code Online (Sandbox Code Playgroud)

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

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


Abs*_*say 8

角 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"
  ]
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*r92 6

对于Angular 7+,

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

declare module "*.json" {
    const value: any;
    export default value;
}
Run Code Online (Sandbox Code Playgroud)

2)导入和访问JSON数据:

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

}
Run Code Online (Sandbox Code Playgroud)

要么:

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

}
Run Code Online (Sandbox Code Playgroud)


小智 5

在angular7中,我只是使用了

let routesObject = require('./routes.json');
Run Code Online (Sandbox Code Playgroud)

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

{

    "routeEmployeeList":    "employee-list",
    "routeEmployeeDetail":      "employee/:id"
}
Run Code Online (Sandbox Code Playgroud)

您使用访问json项目

routesObject.routeEmployeeList
Run Code Online (Sandbox Code Playgroud)


小智 5

我也无法导入不同的 file.json 。但我是这样解决的

const swaggerDoc = require('../swagger.json')
Run Code Online (Sandbox Code Playgroud)