로컬 .json 파일을 읽는 Angular 5 서비스


94

Angular 5를 사용하고 있으며 angular-cli를 사용하여 서비스를 만들었습니다.

내가하고 싶은 것은 Angular 5의 로컬 json 파일을 읽는 서비스를 만드는 것입니다.

이것이 내가 가진 것입니다 ... 조금 붙어 있습니다 ...

import { Injectable } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';

@Injectable()
export class AppSettingsService {

  constructor(private http: HttpClientModule) {
    var obj;
    this.getJSON().subscribe(data => obj=data, error => console.log(error));
  }

  public getJSON(): Observable<any> {
    return this.http.get("./assets/mydata.json")
      .map((res:any) => res.json())
      .catch((error:any) => console.log(error));

  }

}

이 작업을 완료하려면 어떻게해야합니까?


1
angular.io/tutorial/toh-pt6 예를 들어 HttpClientModule생성자에 삽입하면 안됩니다.
AJT82

답변:


132

먼저 주입해야 HttpClient하지 HttpClientModule, 당신은 제거해야 두 번째 것은 .map((res:any) => res.json())새로운이 때문에 더 이상 필요하지 않습니다 HttpClient당신에게 기본적으로 응답의 몸을 줄 것이다, 마지막으로 당신이 가져올 수 있는지 확인 HttpClientModule당신에 AppModule :

import { HttpClient } from '@angular/common/http'; 
import { Observable } from 'rxjs';

@Injectable()
export class AppSettingsService {

   constructor(private http: HttpClient) {
        this.getJSON().subscribe(data => {
            console.log(data);
        });
    }

    public getJSON(): Observable<any> {
        return this.http.get("./assets/mydata.json");
    }
}

이것을 컴포넌트에 추가하려면 :

@Component({
    selector: 'mycmp',
    templateUrl: 'my.component.html',
    styleUrls: ['my.component.css']
})
export class MyComponent implements OnInit {
    constructor(
        private appSettingsService : AppSettingsService 
    ) { }

   ngOnInit(){
       this.appSettingsService.getJSON().subscribe(data => {
            console.log(data);
        });
   }
}

1
이 줄에 "Unresolved Type Observable"이 표시됩니다 ... "public getJSON () : Observable <any> {"

1
마지막 질문 ... 내 구성 요소에서이 데이터를 어떻게 사용할 수 있습니까?

json id를 읽고 싶다면 가정하십시오. 내가 무엇을해야합니까? 당신이 나에게 예를 제공해도 괜찮다면 제발.
user3669026

1
내가 JSON 파일을 가져 오는 동안 404 오류에 직면 .... 또한 .. 당신처럼 같은 흐름을 따라 한
nagender 프라 탑 차우

19

json을 직접 가져 오는 대체 솔루션이 있습니다.

컴파일하려면,이 모듈을 typings.d.ts 파일에 선언하십시오.

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

코드에서

import { data_json } from '../../path_of_your.json';

console.log(data_json)

내가 assets / abc.json에 json을 가지고 있고 하나의 모듈 app.module.ts를 사용한 다음 types.d.ts에서 선언하는 방법과 가져 오는 방법을 가정 해 보겠습니다. 도와주세요.
MahiMan 2017

types.d.ts 파일에서 모듈을 선언하기 만하면됩니다. 그리고 JSON을 클래스로 가져옵니다
Nicolas Law-Dune

어떤 모듈? 앱에서 사용하고 있다고 가정합니다. 기준 치수. TS?
MahiMan

6
했을 때 오류없이 작동하도록했습니다import { default as data_json } from '../../path_of_your.json';
jonas

1
콘솔에 "정의되지 않음"이 표시되는 이유는 무엇입니까?
Gromain

19

Angular 7의 경우 다음 단계에 따라 json 데이터를 직접 가져 왔습니다.

tsconfig.app.json에서 :

추가 "resolveJsonModule": true"compilerOptions"

서비스 또는 구성 요소에서 :

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

그리고

private example = exampleData;

13

웹 서버에서 파일을 읽는 대신 로컬 파일을 실제로 읽는 방법을 찾을 때이 질문을 발견했습니다.이 파일을 "원격 파일"이라고 부르고 싶습니다.

그냥 전화주세요 require:

const content = require('../../path_of_your.json');

Angular-CLI 소스 코드는 저에게 영감을주었습니다. templateUrl속성 template과 값을 require실제 HTML 리소스 에 대한 호출로 대체하여 구성 요소 템플릿이 포함되어 있음을 알게되었습니다 .

AOT 컴파일러를 사용하는 경우 다음을 조정하여 노드 유형 정의를 추가해야합니다 tsconfig.app.json.

"compilerOptions": {
  "types": ["node"],
  ...
},
...

3
사용하려면 여기에 설명 된대로 실행 require하여 설치해야 @types/node했습니다npm install @types/node --save-dev
jaycer

이러한 모든 솔루션은 훌륭하지만,이 날 초기 수입하지 않고 동적으로 파일 내용을 값을 저장하고 분석 할 수있는 유일한 사람 중 하나입니다
아론 매튜스

6
import data  from './data.json';
export class AppComponent  {
    json:any = data;
}

자세한 내용은이 기사를 참조하십시오 .


내 로컬 파일의 경우 사용하기가 가장 쉬웠습니다. "allowSyntheticDefaultImports": true내 tsconfig.json 'compilerOptions' 에 추가 해야했지만 실제 오류가 아닌 TypeScript에 대한 linting 오류 만 중지해야했습니다.
Rin and Len

이것이 해결책입니다 : hackeruna.com/2020/04/27/… 이 오류 TS1259
juanitourquiza

2

이 시도

서비스에 코드 작성

import {Observable, of} from 'rxjs';

json 파일 가져 오기

import Product  from "./database/product.json";

getProduct(): Observable<any> {
   return of(Product).pipe(delay(1000));
}

구성 요소에서

get_products(){
    this.sharedService.getProduct().subscribe(res=>{
        console.log(res);
    })        
}

"resolveJsonModule"을 추가 할 수없는 순간에 대한 최고의 답변 : tsconfig에 true
soni

0

JSON 파일을 만들어 보겠습니다. 이름을 navbar.json으로 지정하고 원하는대로 이름을 지정할 수 있습니다!

navbar.json

[
  {
    "href": "#",
    "text": "Home",
    "icon": ""
  },
  {
    "href": "#",
    "text": "Bundles",
    "icon": "",
    "children": [
      {
        "href": "#national",
        "text": "National",
        "icon": "assets/images/national.svg"
      }
    ]
  }
]

이제 메뉴 데이터가 포함 된 JSON 파일을 만들었습니다. 앱 컴포넌트 파일로 이동하여 아래 코드를 붙여 넣습니다.

app.component.ts

import { Component } from '@angular/core';
import menudata from './navbar.json';

@Component({
  selector: 'lm-navbar',
  templateUrl: './navbar.component.html'
})
export class NavbarComponent {
    mainmenu:any = menudata;

}

이제 Angular 7 앱이 로컬 JSON 파일의 데이터를 제공 할 준비가되었습니다.

app.component.html로 이동하여 다음 코드를 붙여 넣으십시오.

app.component.html

<ul class="navbar-nav ml-auto">
                  <li class="nav-item" *ngFor="let menu of mainmenu">
                  <a class="nav-link" href="{{menu.href}}">{{menu.icon}} {{menu.text}}</a>
                  <ul class="sub_menu" *ngIf="menu.children && menu.children.length > 0"> 
                            <li *ngFor="let sub_menu of menu.children"><a class="nav-link" href="{{sub_menu.href}}"><img src="{{sub_menu.icon}}" class="nav-img" /> {{sub_menu.text}}</a></li> 
                        </ul>
                  </li>
                  </ul>

0

Typescript 3.6.3 및 Angular 6을 사용하면 이러한 솔루션 중 어느 것도 저에게 효과가 없었습니다.

어떤 작업은 튜토리얼을 따라하는 것이 었습니다 여기 당신이라는 작은 파일을 추가 할 필요가 말한다 njson-typings.d.ts이 포함 프로젝트에를 :

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

이 작업이 완료되면 하드 코딩 된 json 데이터를 간단히 가져올 수 있습니다.

import employeeData from '../../assets/employees.json';

내 구성 요소에서 사용하십시오.

export class FetchDataComponent implements OnInit {
  public employees: Employee[];

  constructor() {
    //  Load the data from a hardcoded .json file
    this.employees = employeeData;
    . . . .
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.