【问题标题】:How to import JSON File into a TypeScript file?如何将 JSON 文件导入 TypeScript 文件?
【发布时间】:2018-04-10 00:21:57
【问题描述】:

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

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

【问题讨论】:

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

标签: json angular google-maps typescript maps


【解决方案1】:

在最近的打字稿更新之前,Aonepathan 的单行字一直为我工作。

我发现 Jecelyn Yeen 的 post 建议将此 sn-p 发布到您的 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. 在您的tsconfig.json 文件中使用此行添加resolveJsonModule 支持:
"compilerOptions": {
    ...
    "resolveJsonModule": true
  }

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

import data from './example.json';

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

【讨论】:

  • 这对我也很有效——超级流畅!注意:您需要重新启动开发服务器才能正确编译。
  • 我收到Cannot find module '*.json'. Consider using '--resolveJsonModule' to import module with '.json' extensionts(2732)
  • 我还需要按照 typescript 文档中的说明添加"esModuleInterop": true,,但是他们也说使用commonjs 作为module 而不是esnext。这似乎适用于任何一个。是否有任何理由切换到 commonjs(如文档中所述)而不是坚持使用 esnext 的默认值?
  • 与上面的 cmets 相同,我需要 "esModuleInterop":true。此外 VS 代码仍然向我显示错误.. 但一切正常
  • 我必须在 compilerOptions 中添加 "allowSyntheticDefaultImports": true 以及新的 Angular 9.1.11 项目。
【解决方案2】:

this reddit post 中所述,在 Angular 7 之后,您可以将事情简化为这两个步骤:

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

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

【讨论】:

  • esModuleInterop 是干什么用的?
  • @giovannipds 用于默​​认 json 导入
  • 就我而言,Angular 10 和 Typescript 4.0.2,我不需要 "allowSyntheticDefaultImports"
【解决方案3】:

这是基于@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 文件怎么办?
  • 那么你必须在你的项目根目录中创建一个只有第 2 步内容的项目
  • 重要提示:将自定义类型文件添加到 tsconfig.json 中的 typeRoots "typeRoots": ["node_modules/@types", "src/typings.d.ts"],
【解决方案4】:

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

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

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

【讨论】:

  • 我得到了error TS2304: Cannot find name 'require'. 已通过添加declare var require: any; 解决,如问题stackoverflow.com/questions/43104114/… 接受答案的cmets 中所述。
  • @Ben,您需要将节点类型添加到您的 tsconfig。即"compilerOptions": { ... "types": ["node"] },这是需要它的人的相关答案:stackoverflow.com/a/35961176/1754995
  • 嗨@aonepathan,我希望你能帮助我:我有一个使用 require 来读取 json 文件的库。 var json = require('./[yourFileNameHere]'); 没有扩展名。在编译时我有一个错误:Module not found: Error: Can't resolve [yourFileNameHere] in [file name]你有什么想法绕过这个问题吗?
【解决方案5】:

第一个解决方案 - 只需将 .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 发生变化,它不需要您重新构建整个应用程序(它是从单独的文件动态加载的,因此您可以修改只有那个文件)。

【讨论】:

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

我已经阅读了一些回复,但它们似乎对我不起作用。我正在使用 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

【讨论】:

  • 这对我来说是最好的解决方案。无需打字文件, TS 可以为您解析属性名称。
  • 这是一个很好的解决方案,您甚至不必使用 JSON.parse()。它是开箱即用的常见 TS 对象!
【解决方案7】:

截至Typescript 2.9,只需添加:

"compilerOptions": {
    "resolveJsonModule": true
}

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

data.json:

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

在您的 Typescript 文件中:

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

【讨论】:

    【解决方案8】:

    Angular 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"
      ]
    }
    

    【讨论】:

      【解决方案9】:

      对于 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 挂了我。感谢您提供完整的示例!
      • 请注意 json 文件的路径,因为它与您导入文件的文件有关,例如如果您在 src/app/services/ 文件夹中有服务并且您的 json 在 src/assets/data/ 文件夹中,您必须像 ../../assets/data/your.json 一样指定它
      • 完美运行,但为什么需要typings.d.ts文件?
      【解决方案10】:

      在angular7中,我只是简单地使用了

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

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

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

      您可以使用

      访问 json 项目
      routesObject.routeEmployeeList
      

      【讨论】:

      • 就是这样! ;-) 所有其他选项都太老套了!如果你有 TSLint 会抛出 reuqire 错误 - 只需在类组件顶部添加 declare var require: any;
      【解决方案11】:
      let fs = require('fs');
      let markers;
      fs.readFile('./markers.json', handleJSONFile);
      
      var handleJSONFile = function (err, data) {
         if (err) {
            throw err;
         }
         markers= JSON.parse(data);
       }
      

      【讨论】:

        【解决方案12】:

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

        const swaggerDoc = require('../swagger.json')
        

        【讨论】:

          猜你喜欢
          • 2020-06-24
          • 2019-08-01
          • 2016-05-10
          • 2017-10-02
          • 2019-06-25
          • 2019-12-11
          • 2018-10-04
          • 2020-03-22
          相关资源
          最近更新 更多