Làm cách nào để nhập tệp JSON vào tệp TypeScript?


86

Tôi đang xây dựng một ứng dụng bản đồ bằng Angular Maps và muốn nhập tệp JSON dưới dạng danh sách các điểm đánh dấu xác định vị trí. Tôi hy vọng sử dụng tệp JSON này làm mảng đánh dấu [] bên trong app.component.ts. Thay vì xác định một mảng đánh dấu được mã hóa cứng bên trong tệp TypeScript.

Quy trình tốt nhất để nhập tệp JSON này để sử dụng trong dự án của tôi là gì? Bất kỳ hướng đánh giá rất cao!


bạn có thể xem câu trả lời của tôi vì nó được áp dụng cho góc 7+
Yulian

Câu trả lời:


115

Aonepathan's one-liner đã làm việc cho tôi cho đến khi có bản cập nhật sắp chữ gần đây.

Tôi tìm thấy bài đăng của Jecelyn Yeen đề xuất đăng đoạn mã này vào tệp Định nghĩa TS của bạn

thêm tệp typings.d.tsvào thư mục gốc của dự án với nội dung bên dưới

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

và sau đó nhập dữ liệu của bạn như sau:

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

cập nhật tháng 7 năm 2019:

Typecript 2.9 ( docs ) đã giới thiệu một giải pháp tốt hơn, thông minh hơn. Các bước:

  1. Thêm resolveJsonModulehỗ trợ bằng dòng này trong tsconfig.jsontệp của bạn :
"compilerOptions": {
    ...
    "resolveJsonModule": true
  }

câu lệnh nhập bây giờ có thể giả sử xuất mặc định:

import data from './example.json';

và intellisense bây giờ sẽ kiểm tra tệp json để xem liệu bạn có thể sử dụng các phương thức Array v.v. tuyệt đấy.


Phương pháp này có hiệu quả với tôi và dường như là cách rõ ràng và trực tiếp nhất để giải quyết vấn đề.
Jason Van Der Meijden

3
Điều này cũng làm việc cho tôi - siêu trơn tru! LƯU Ý: Bạn cần khởi động lại máy chủ nhà phát triển của mình để máy chủ này biên dịch chính xác.
Scott Byers

12
Tôi đang nhậnCannot find module '*.json'. Consider using '--resolveJsonModule' to import module with '.json' extensionts(2732)
Jeremy Thille

3
Tôi cần cũng để thêm "esModuleInterop": true,theo quy định tại các tài liệu đánh máy, tuy nhiên họ cũng nói để sử dụng commonjsnhư là modulethay vì esnext. Điều này dường như làm việc với một trong hai. Có lý do gì để chuyển sang commonjs (như đã đề cập trong tài liệu) để phản đối việc gắn bó với mặc định của esnext không?
timhc22

5
Tôi đã có thêm "allowSyntheticDefaultImports": truetrong compilerOptionscũng như với một dự án mới mẻ góc 9.1.11.
yohosuff

28

Như đã nêu trong bài đăng reddit này , sau Angular 7, bạn có thể đơn giản hóa mọi thứ theo 2 bước sau:

  1. Thêm ba dòng đó compilerOptionsvào tsconfig.jsontệp của bạn :
"resolveJsonModule": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
  1. Nhập dữ liệu json của bạn:
import myData from '../assets/data/my-data.json';

Và đó là nó. Bây giờ bạn có thể sử dụng myDatatrong các thành phần / dịch vụ của mình.


Để làm gì esModuleInterop?
giovannipds

25

Đây là câu trả lời đầy đủ cho Angular 6+ dựa trên câu trả lời @ryanrain:

Từ tài liệu angle-cli , json có thể được coi là tài sản và được truy cập từ nhập tiêu chuẩn mà không cần sử dụng yêu cầu ajax.

Giả sử bạn thêm tệp json của mình vào thư mục "your-json-dir":

  1. thêm "your-json-dir" vào tệp angle.json (:

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

  2. tạo hoặc chỉnh sửa tệp typings.d.ts (tại gốc dự án của bạn) và thêm nội dung sau:

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

    Điều này sẽ cho phép nhập các mô-đun ".json" mà không có lỗi sắp chữ.

  3. trong tệp bộ điều khiển / dịch vụ / bất kỳ thứ gì khác của bạn, chỉ cần nhập tệp bằng cách sử dụng đường dẫn tương đối này:

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


3
Điều gì xảy ra nếu tôi không có tệp typings.d.ts?
Kristopher Windsor

2
sau đó bạn phải tạo một ở gốc của dự án của bạn chỉ với nội dung bước 2
Benjamin Caure

2
Lưu ý quan trọng: Thêm tập tin tùy chỉnh để gõ typeRoots trong tsconfig.json "typeRoots": [ "node_modules / @ loại", "src / typings.d.ts"],
JAPO Domingo

22

Cảm ơn những người đã đóng góp ý kiến, tôi đã có thể tìm thấy bản sửa lỗi, tôi đã thêm và xác định json trên đầu tệp app.component.ts:

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

Điều này cuối cùng đã tạo ra các điểm đánh dấu và là một dòng mã đơn giản.


6
Tôi đã được error TS2304: Cannot find name 'require'.Giải quyết bằng cách thêm declare var require: any;, như đã giải thích trong các nhận xét về câu trả lời được chấp nhận cho câu hỏi stackoverflow.com/questions/43104114/… .
Ben

4
@Ben, bạn cần thêm loại nút vào tsconfig của mình. tức là "compilerOptions": { ... "types": ["node"] },Đây là câu trả lời liên quan cho những người yêu cầu nó: stackoverflow.com/a/35961176/1754995
Kody

Chào bạn @aonepathan, mong bạn giúp đỡ: Tôi có một thư viện sử dụng request để đọc tệp json. var json = require('./[yourFileNameHere]');mà không có phần mở rộng. Tại thời điểm biên dịch, tôi gặp lỗi: Module not found: Error: Can't resolve [yourFileNameHere] in [file name]bạn có ý kiến ​​nào để bỏ qua vấn đề này không?
Neo1975,

16

Giải pháp đầu tiên - chỉ cần thay đổi phần mở rộng của tệp .json của bạn thành .ts và thêm export defaultvào đầu tệp, như sau:

export default {
   property: value;
}

Sau đó, bạn có thể chỉ cần nhập tệp mà không cần thêm kiểu chữ, như sau:

import data from 'data';

Giải pháp thứ hai lấy json thông qua HttpClient.

Chèn HttpClient vào thành phần của bạn, như sau:

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

và sau đó sử dụng mã này:

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

https://angular.io/guide/http

Giải pháp này có một điểm vượt trội so với các giải pháp khác được cung cấp ở đây - nó không yêu cầu bạn phải xây dựng lại toàn bộ ứng dụng nếu json của bạn thay đổi (nó được tải động từ một tệp riêng biệt, vì vậy bạn chỉ có thể sửa đổi tệp đó).


1
giải pháp đầu tiên là tốt nếu dữ liệu của bạn là tĩnh và sẽ không thay đổi trong một thời gian rất dài; nó sẽ giúp bạn tiết kiệm được yêu cầu http không cần thiết, nhưng nếu dữ liệu này thay đổi liên tục, sau đó sử dụng giải pháp thứ hai được gửi bởi máy chủ hoặc thậm chí xem xét thêm nó vào một cơ sở dữ liệu nếu tập dữ liệu là rất lớn
OzzyTheGiant

10

Tôi đã đọc một số câu trả lời và chúng dường như không hiệu quả với tôi. Tôi đang sử dụng Typecript 2.9.2, Angular 6 và cố gắng nhập JSON trong Kiểm tra đơn vị Jasmine. Đây là những gì đã làm lừa cho tôi.

Thêm vào:

"resolveJsonModule": true,

Đến tsconfig.json

Nhập như:

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

Dừng lại ng test, bắt đầu lại.

Tham khảo: https://blogs.msdn.microsoft.com/typescript/2018/05/31/annocting-typescript-2-9/#json-imports


1
Đây là giải pháp tốt nhất cho tôi. Không cần tệp đánh máy TS có thể giải quyết các tên thuộc tính cho bạn.
Steve Hobbs

7

Đối với Angular 7+,

1) thêm tệp "typings.d.ts" vào thư mục gốc của dự án (ví dụ: src / typings.d.ts):

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

2) nhập và truy cập dữ liệu JSON:

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

}

hoặc là:

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

}

data.default đã treo tôi lên. Cảm ơn vì ví dụ đầy đủ!
kevin_fitz 21/1218

Hãy cẩn thận về đường dẫn đến file json của bạn bởi vì nó có liên quan đến tập tin bạn nhập các tập tin ví dụ như nếu bạn có một dịch vụ trong src/app/services/thư mục và json bạn đang ở trong src/assets/data/thư mục mà bạn phải xác định nó như../../assets/data/your.json
Adam Boczek

Nó hoạt động hoàn hảo, nhưng tại sao lại cần tệp typings.d.ts?
robert

5

Trong angle7, tôi chỉ đơn giản sử dụng

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

Tệp route.json của tôi trông giống như thế này

{

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

Bạn truy cập các mục json bằng cách sử dụng

routesObject.routeEmployeeList

Đó là nó! ;-) Tất cả các tùy chọn khác đều rất hacky! Nếu bạn có TSLint sẽ xuất hiện một reuqirelỗi - chỉ cần thêm declare var require: any;vào đầu thành phần lớp.
Pedro Ferreira

5

Kể từ Typecript 2.9 , người ta có thể chỉ cần thêm:

"compilerOptions": {
    "resolveJsonModule": true
}

đến tsconfig.json. Sau đó, thật dễ dàng để sử dụng tệp json ( cũng sẽ có suy luận kiểu tốt trong VSCode):

data.json:

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

Trong tệp tệp Typecript của bạn:

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


2
let fs = require('fs');
let markers;
fs.readFile('./markers.json', handleJSONFile);

var handleJSONFile = function (err, data) {
   if (err) {
      throw err;
   }
   markers= JSON.parse(data);
 }

2

Góc 10

Thay vào đó, bạn nên chỉnh sửa tệp tsconfig.app.json(lưu ý "ứng dụng" trong tên).

Ở đó, bạn sẽ tìm thấy compilerOptionsvà bạn chỉ cần thêm resolveJsonModule: true.

Vì vậy, ví dụ: tệp trong một dự án hoàn toàn mới sẽ trông như thế này:

/* 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"
  ]
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.