Usługa Angular 5 do odczytu lokalnego pliku .json

98

Używam Angular 5 i utworzyłem usługę przy użyciu angular-cli

Chcę stworzyć usługę odczytującą lokalny plik JSON dla Angular 5.

Oto, co mam ... Trochę utknąłem ...

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

  }

}

Jak mogę to zakończyć?

dhilt
źródło
1
angular.io/tutorial/toh-pt6 Na przykład HttpClientModulenie powinno być wstrzykiwane w konstruktorze.
AJT82

Odpowiedzi:

133

Najpierw musisz wstrzyknąć, HttpClienta nie HttpClientModule, druga rzecz, którą musisz usunąć .map((res:any) => res.json()), nie będzie już potrzebna, ponieważ nowa HttpClientdomyślnie poda ci treść odpowiedzi, na koniec upewnij się, że importujesz HttpClientModulew 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");
    }
}

aby dodać to do swojego komponentu:

@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
źródło
1
Otrzymuję „Nierozwiązany typ obserwowalny” ... w tym wierszu „public getJSON (): Observable <any> {"
1
Ostatnie pytanie ... Jak mogę te dane z mojego komponentu?
przypuśćmy, że chcę odczytać identyfikator json. Co muszę zrobić? Proszę, jeśli nie masz nic przeciwko, podaj mi przykład.
user3669026
1
napotkałem błąd 404 podczas pobierania pliku json .... i również postępuj zgodnie z tym samym przepływem, co twój ..
nagender pratap chauhan
19

Masz alternatywne rozwiązanie, importując bezpośrednio plik json.

Aby skompilować, zadeklaruj ten moduł w pliku typings.d.ts

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

W twoim kodzie

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

console.log(data_json)
Nicolas Law-Dune
źródło
Załóżmy, że mam plik json w pliku asset / abc.json i używając tylko jednego modułu app.module.ts, a następnie jak zadeklarować w typing.d.ts i jak importować. Proszę pomóż.
Mahi,
Po prostu zadeklaruj moduł w swoim pliku typing.d.ts. I zaimportuj swój JSON do swojej klasy
Nicolas Law-Dune
Który moduł? Załóżmy, że używam go w aplikacji. moduł. ts?
Mahi,
6
Dostałem to do pracy bez błędów, kiedy to zrobiłemimport { default as data_json } from '../../path_of_your.json';
jonas
1
Dlaczego w konsoli wyświetlany jest komunikat „undefined”?
Gromain
19

W przypadku Angular 7 wykonałem następujące kroki, aby bezpośrednio zaimportować dane json:

W tsconfig.app.json:

dodać "resolveJsonModule": truew"compilerOptions"

W usłudze lub komponencie:

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

I wtedy

private example = exampleData;
jaycer
źródło
13

Znalazłem to pytanie, kiedy szukałem sposobu, aby naprawdę odczytać plik lokalny zamiast czytać plik z serwera WWW, który wolałbym nazwać „plikiem zdalnym”.

Po prostu zadzwoń require:

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

Zainspirował mnie kod źródłowy Angular-CLI: dowiedziałem się, że zawierają one szablony komponentów, zastępując templateUrlwłaściwość przez, templatea wartość przez requirewywołanie rzeczywistego zasobu HTML.

Jeśli używasz kompilatora AOT, musisz dodać definicje typu węzła, dostosowując tsconfig.app.json:

"compilerOptions": {
  "types": ["node"],
  ...
},
...
ość rybna
źródło
3
Aby użyć require, musiałem zainstalować @types/node, uruchamiając, npm install @types/node --save-devjak omówiono tutaj
jaycer
wszystkie te rozwiązania są świetne, ale jest to jedno z niewielu, które pozwoli mi na dynamiczne zapisywanie wartości i analizowanie zawartości pliku bez wstępnego importu
Aaron Matthews
6
import data  from './data.json';
export class AppComponent  {
    json:any = data;
}

Więcej informacji znajdziesz w tym artykule .

Ole
źródło
W przypadku mojego pliku lokalnego był to najłatwiejszy w użyciu. Musiałem dodać "allowSyntheticDefaultImports": truedo mojego tsconfig.json 'compilerOptions', ale tylko po to, aby zatrzymać błąd lintingu dla TypeScript, a NIE rzeczywisty błąd.
Rin i Len
Oto rozwiązanie: hackeruna.com/2020/04/27/… dla tego błędu TS1259
juanitourquiza
3

Spróbuj tego

Napisz kod w swojej usłudze

import {Observable, of} from 'rxjs';

importuj plik json

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

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

W komponencie

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

źródło
1
Najlepsza odpowiedź na ten moment dla tych, którzy nie są w stanie dodać „olveJsonModule ”: prawda w ich tsconfig
soni
0

Stwórzmy plik JSON, nazywamy go navbar.json, możesz go nazwać, jak chcesz!

navbar.json

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

Teraz stworzyliśmy plik JSON z danymi menu. Przejdziemy do pliku składnika aplikacji i wkleimy poniższy kod.

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;

}

Teraz Twoja aplikacja Angular 7 jest gotowa do obsługi danych z lokalnego pliku JSON.

Przejdź do app.component.html i wklej w nim następujący kod.

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
źródło
0

Używając Typescript 3.6.3 i Angular 6, żadne z tych rozwiązań nie działało dla mnie.

Co zrobił pracy było śledzić tutorial tutaj który mówi, trzeba dodać mały plik o nazwie njson-typings.d.tsdo projektu, zawierające w ten sposób:

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

Gdy to zrobiłem, mogłem po prostu zaimportować moje zakodowane na stałe dane json:

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

i użyj go w moim komponencie:

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

  constructor() {
    //  Load the data from a hardcoded .json file
    this.employees = employeeData;
    . . . .
  }
Mike Gledhill
źródło