JSON 파일을 TypeScript 파일로 가져 오는 방법은 무엇입니까?


86

Angular Maps를 사용하여지도 애플리케이션을 구축 중이며 JSON 파일을 위치를 정의하는 마커 목록으로 가져오고 싶습니다. 이 JSON 파일을 app.component.ts 내부의 marker [] 배열로 사용하고 싶습니다. TypeScript 파일 내에 하드 코딩 된 마커 배열을 정의하는 대신.

내 프로젝트에서 사용하기 위해이 JSON 파일을 가져 오는 가장 좋은 프로세스는 무엇입니까? 어떤 방향으로도 대단히 감사합니다!


이 7+ 각도에 적용 당신은 내 대답을 볼 수 있습니다
Yulian

답변:


115

Aonepathan의 one-liner는 최근 typescript 업데이트까지 나를 위해 일했습니다.

이 스 니펫을 TS 정의 파일에 게시 할 것을 제안하는 Jecelyn Yeen의 게시물 을 찾았습니다.

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. 파일에 다음 resolveJsonModule행으로 지원을 추가 tsconfig.json하십시오.
"compilerOptions": {
    ...
    "resolveJsonModule": true
  }

import 문은 이제 기본 내보내기를 가정 할 수 있습니다.

import data from './example.json';

intellisense는 이제 json 파일을 확인하여 Array 등의 메소드를 사용할 수 있는지 확인합니다. 정말 멋진.


3
이것은 나에게도 효과적이었습니다-매우 매끄러운! 참고 : 올바르게 컴파일하려면 dev 서버를 다시 시작해야합니다.
Scott Byers

13
나는군요Cannot find module '*.json'. Consider using '--resolveJsonModule' to import module with '.json' extensionts(2732)
제레미 Thille에게

4
나는 또한 추가 할 필요 "esModuleInterop": true,하지만 그들은 또한 사용하는 말, 타이프 스크립트의 문서에 지정된대로 commonjs는 AS module대신 esnext. 이것은 둘 중 하나와 함께 작동하는 것 같습니다. esnext의 기본값을 고수하는 것과 반대로 commonjs (문서에서 언급했듯이)로 전환 할 이유가 있습니까?
timhc22 '1910.29

1
위의 의견과 동일합니다 "esModuleInterop":true. 또한 여전히 VS 코드는 나에게 오류를 보여주고있다 ..하지만 모든 작동합니다
마이키

6
새로운 Angular 9.1.11 프로젝트 를 추가해야 "allowSyntheticDefaultImports": true했습니다 compilerOptions.
yohosuff

28

이 reddit 게시물 에서 언급했듯이 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

@giovannipds 기본 json 가져 오기 용입니다
Vasia Zaretskyi

25

@ryanrain 답변을 기반으로 한 Angular 6+에 대한 완전한 답변은 다음과 같습니다.

에서 각-CLI 문서 , JSON은 자산으로 간주 될 수 있으며 아약스 요청을 사용하지 않고 표준 수입에서 액세스.

"your-json-dir"디렉토리에 json 파일을 추가한다고 가정 해 보겠습니다.

  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; }

    그러면 typescript 오류없이 ".json"모듈을 가져올 수 있습니다.

  3. 컨트롤러 / 서비스 / 기타 파일에서 다음 상대 경로를 사용하여 파일을 가져 오면됩니다.

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


3
types.d.ts 파일이 없으면 어떻게합니까?
Kristopher Windsor

2
당신은 단지 2 단계 내용으로 프로젝트 루트를 만들어야합니다
벤자민 Caure

2
중요 사항 : tsconfig.json에 typeRoots에 "typeRoots을"사용자 정의 입력 파일을 추가합니다 : [ "node_modules / @ 유형", "SRC / typings.d.ts"]
Japo 도밍고에게

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/... .
Ben

4
@Ben, tsconfig에 노드 유형을 추가해야합니다. 즉 "compilerOptions": { ... "types": ["node"] },, 필요한 사람들을위한 관련 답변이 있습니다 : stackoverflow.com/a/35961176/1754995
Kody

안녕하세요 @aonepathan, 당신이 저를 도울 수 있기를 바랍니다. json 파일을 읽는 데 필요한 라이브러리가 있습니다. var json = require('./[yourFileNameHere]');확장자없이. 컴파일 타임에 오류가 있습니다. Module not found: Error: Can't resolve [yourFileNameHere] in [file name]이 문제를 우회 할 생각이 있습니까?
Neo1975

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 Unit Test에서 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
이것은 나에게 가장 좋은 해결책이었습니다. 어떤 typings 필요한 파일이 없습니다, 그리고 TS 당신의 속성 이름을 확인할 수 있습니다.
Steve Hobbs

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
아담 Boczek

완벽하게 작동하지만, 왜 typings.d.ts 파일이 필요한가요?
로버트

5

angular7에서는 간단히

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

내 route.json 파일은 다음과 같습니다.

{

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

다음을 사용하여 json 항목에 액세스합니다.

routesObject.routeEmployeeList

그게 다야! ;-) 다른 모든 옵션은 너무 엉망입니다! TSLint가 있으면 reuqire오류가 발생 declare var require: any;합니다. 클래스 구성 요소 위에 추가 하기 만하면됩니다 .
Pedro Ferreira

5

현재 타이프 2.9 , 하나는 간단하게 추가 할 수 있습니다 :

"compilerOptions": {
    "resolveJsonModule": true
}

tsconfig.json. 그 후에는 json 파일을 사용하기 쉽습니다 ( 그리고 VSCode에서도 좋은 유형 추론이있을 것입니다).

data.json:

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

Typescript 파일에서 :

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

각도 10

이제 편집해야합니다 tsconfig.app.json( "앱" 대신 파일 (이름 에 합니다.

거기에서를 찾을 수 있으며 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"
  ]
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.