Service Angular 5 pour lire le fichier .json local

94

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

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

C'est 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 terminer cela?

dhilt
la source
1
angular.io/tutorial/toh-pt6 Par exemple, HttpClientModulene doit pas être injecté dans le constructeur.
AJT82

Réponses:

132

Vous devez d'abord injecter HttpClientet non HttpClientModule, deuxième chose que vous devez supprimer .map((res:any) => res.json())vous n'en aurez plus besoin car le nouveau HttpClientvous donnera le corps de la réponse par défaut, enfin assurez-vous d'importer HttpClientModuledans 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);
        });
   }
}
Bougarfaoui El houcine
la source
1
J'obtiens "Unresolved Type Observable" ... sur cette ligne "public getJSON (): Observable <any> {"
1
Une dernière question ... Comment puis-je récupérer ces données de mon composant?
supposons que si je veux lire json id. Ce que je dois faire? S'il vous plaît, si cela ne vous dérange pas, donnez-moi l'exemple.
user3669026
1
J'ai fait face à une erreur 404 lors de la récupération du fichier json .... et suivez également le même flux que le vôtre ..
nagender pratap chauhan
19

Vous avez une solution alternative, importer directement votre fichier 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)
Nicolas Law-Dune
la source
Supposons que j'ai mon json dans assets / abc.json, et n'utilise qu'un seul module app.module.ts, puis comment déclarer dans typing.d.ts et comment importer. Veuillez aider.
MahiMan
Déclarez simplement le module dans votre fichier typing.d.ts. Et importez votre JSON dans votre classe
Nicolas Law-Dune
Quel module? Supposons que je l'utilise dans l'application. module. ts?
MahiMan
6
Je l'ai fait fonctionner sans erreur quand je l'ai faitimport { default as data_json } from '../../path_of_your.json';
jonas
1
Pourquoi est-ce que j'obtiens "indéfini" dans la console?
Gromain
19

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

Dans tsconfig.app.json:

ajouter "resolveJsonModule": true à"compilerOptions"

Dans un service ou un composant:

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

Puis

private example = exampleData;
Jaycer
la source
13

J'ai trouvé cette question en cherchant un moyen de vraiment lire un fichier local au lieu de lire un fichier depuis le serveur Web, que je préfère appeler un "fichier distant".

Appelez simplement require:

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

Le code source Angular-CLI m'a inspiré: j'ai découvert qu'ils incluent des modèles de composants en remplaçant la templateUrlpropriété par templateet la valeur par unrequire appel à la ressource HTML réelle.

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

"compilerOptions": {
  "types": ["node"],
  ...
},
...
arête
la source
3
Pour l'utiliser, requirej'avais besoin d'installer @types/nodeen exécutant npm install @types/node --save-devcomme indiqué ici
jaycer
toutes ces solutions sont excellentes, mais c'est l'une des seules qui me permettra d'enregistrer les valeurs et d'analyser le contenu du fichier dynamiquement sans importation initiale
Aaron Matthews
6
import data  from './data.json';
export class AppComponent  {
    json:any = data;
}

Consultez cet article pour plus de détails .

Ole
la source
Pour mon fichier local, c'était le plus simple à utiliser. J'ai dû ajouter "allowSyntheticDefaultImports": trueà mon tsconfig.json 'compilerOptions', mais uniquement pour arrêter une erreur de peluchage pour TypeScript, PAS une erreur réelle.
Rin and Len
Voici la solution: hackeruna.com/2020/04/27/… pour cette erreur TS1259
juanitourquiza
2

Essaye ça

Écrivez du code dans votre service

import {Observable, of} from 'rxjs';

importer un fichier json

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

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

Dans le composant

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

la source
Meilleure réponse pour le moment pour ceux qui ne sont pas en mesure d'ajouter "resolutionJsonModule": true dans leur tsconfig
soni
0

Créons un fichier JSON, nous le nommons navbar.json, vous pouvez le nommer comme vous le souhaitez!

navbar.json

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

Nous avons maintenant créé un fichier JSON avec des données de menu. Nous allons aller au fichier du composant de l'application et coller le code ci-dessous.

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;

}

Votre application Angular 7 est maintenant prête à servir les données du fichier JSON local.

Accédez à app.component.html et collez-y le code suivant.

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>
Surya R Praveen
la source
0

En utilisant Typescript 3.6.3 et Angular 6, aucune de ces solutions n'a fonctionné pour moi.

Ce qui a fonctionné, c'est de suivre le tutoriel ici qui dit que vous devez ajouter un petit fichier appelé njson-typings.d.tsà votre projet, contenant ceci:

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

Une fois cela fait, je pourrais simplement importer mes données json codées en dur:

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

et utilisez-le dans mon composant:

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

  constructor() {
    //  Load the data from a hardcoded .json file
    this.employees = employeeData;
    . . . .
  }
Mike Gledhill
la source