114 votes

Service Angular 5 pour lire le fichier .json local

J'utilise Angular 5 et j'ai créé un service en utilisant angular-cli

Ce que je veux faire est de créer un service qui lit un fichier json local pour Angular 5.

Voici ce que j'ai ... Je suis un peu coincé...

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

  }

}

Comment puis-je le terminer ?

1 votes

angular.io/tutorial/toh-pt6 Par exemple, HttpClientModule ne doit pas être injecté dans le constructeur.

157voto

Bougarfaoui El houcine Points 13920

D'abord, vous devez injecter HttpClient et non HttpClientModule , la deuxième chose que vous devez enlever .map((res:any) => res.json()) vous n'en aurez plus besoin car la nouvelle HttpClient vous donnera le corps de la réponse par défaut, enfin assurez-vous que vous importez HttpClientModule dans votre 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");
    }
}

pour l'ajouter à votre composant :

@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 votes

J'obtiens "Unresolved Type Observable" ... sur cette ligne "public getJSON() : Observable<any> {"

1 votes

Une dernière question ... Comment puis-je obtenir ces données à partir de mon composant ?

0 votes

Supposons que je veuille lire l'identifiant json. Que dois-je faire ? S'il vous plaît, si cela ne vous dérange pas, donnez-moi un exemple.

25voto

jaycer Points 1282

Pour Angular 7, j'ai suivi ces étapes pour importer directement des données json :

Dans tsconfig.app.json :

ajouter "resolveJsonModule": true sur "compilerOptions"

Dans un service ou un composant :

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

Et puis

private example = exampleData;

0 votes

Ça marche. Merci !

19voto

Nicolas Law-Dune Points 744

Vous avez une solution alternative, importer directement votre json.

Pour compiler, déclarez ce module dans votre fichier typings.d.ts

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

Dans votre code

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

console.log(data_json)

0 votes

Supposons que j'ai mon json dans assets/abc.json, et que j'utilise un seul module app.module.ts, alors comment déclarer dans typing.d.ts et comment importer. Merci de m'aider.

0 votes

Il suffit de déclarer le module dans votre fichier typing.d.ts. Et importez votre JSON dans votre classe

0 votes

Quel module ? Supposons que je l'utilise dans le module app. ts ?

16voto

fishbone Points 505

J'ai trouvé cette question en cherchant un moyen de lire réellement un fichier local au lieu de lire un fichier du serveur web, que je préfère appeler un "fichier distant".

Appelez simplement require :

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

Le code source d'Angular-CLI m'a inspiré : J'ai découvert qu'ils incluent des modèles de composants en remplaçant la balise templateUrl propriété par template et la valeur par un require à la ressource HTML réelle.

Si vous utilisez le compilateur AOT, vous devez ajouter les définitions de type de nœud en ajustant les paramètres suivants tsconfig.app.json :

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

3 votes

Pour utiliser require J'avais besoin d'installer @types/node en courant npm install @types/node --save-dev comme discuté aquí

0 votes

Toutes ces solutions sont excellentes, mais celle-ci est l'une des seules qui me permette de sauvegarder les valeurs et d'analyser le contenu du fichier de manière dynamique sans importation initiale.

6voto

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

Voir cet article pour plus de détails .

0 votes

Pour mon fichier local, c'était le plus simple à utiliser. J'ai dû ajouter "allowSyntheticDefaultImports": true à mon tsconfig.json 'compilerOptions', mais seulement pour empêcher une erreur de linting pour TypeScript, PAS une erreur réelle.

0 votes

Voici la solution : hackeruna.com/2020/04/27/… pour cette erreur TS1259

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X