Yerel .json dosyasını okumak için Angular 5 Hizmeti


100

Angular 5 kullanıyorum ve angular-cli kullanarak bir hizmet oluşturdum

Yapmak istediğim, Angular 5 için yerel bir json dosyası okuyan bir hizmet oluşturmaktır.

Sahip olduğum şey bu ... Biraz sıkıştım ...

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

  }

}

Bunu nasıl bitirebilirim?


1
angular.io/tutorial/toh-pt6 Örneğin, yapıcıyaHttpClientModule enjekte edilmemelidir.
AJT82

Yanıtlar:


133

İlk Sen enjekte etmek zorunda HttpClientve değil HttpClientModule, kaldırmak zorunda ikinci şey .map((res:any) => res.json())yeni çünkü seni Artık ona ihtiyacım olmayacak HttpClientsize varsayılan olarak tepki gövdesini verecektir nihayet emin içe olun HttpClientModuleGözlerinde farklı 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");
    }
}

Bunu Bileşeninize eklemek için:

@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
Bu satırda "Çözümlenmemiş Tip Gözlemlenebilir" mesajı alıyorum ... "public getJSON (): Gözlemlenebilir <any> {"

1
Son bir soru ... Bu verileri bileşenimden nasıl alabilirim?

json kimliğini okumak istersem varsayalım. Ne yapmalıyım? Lütfen sakıncası yoksa bana örnek ver.
user3669026

1
json dosyasını alırken 404 hatasıyla karşılaştım .... ve sizinkiyle aynı akışı takip
ediyorum

19

Doğrudan json'unuzu içe aktaran alternatif bir çözümünüz var.

Derlemek için typings.d.ts dosyanızda bu modülü bildirin

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

Kodunuzda

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

console.log(data_json)

Diyelim ki, json'um varlıklar / abc.json'da ve sadece bir modül app.module.ts kullanıyorum, sonra typing.d.ts'de nasıl bildirilir ve nasıl içe aktarılır. Lütfen yardım et.
Mahi

Sadece typing.d.ts dosyanızda modülü beyan edin. JSON'nuzu sınıfınıza aktarın
Nicolas Law-Dune

Hangi modül? Sanırım bunu uygulamada kullanıyorum. modül. ts?
Mahi

6
Bunu yaptığımda hatasız bir şekilde çalıştırdımimport { default as data_json } from '../../path_of_your.json';
jonas

1
Konsolda neden "tanımsız" alıyorum?
Gromain

19

Angular 7 için json verilerini doğrudan içe aktarmak için şu adımları izledim:

Tsconfig.app.json içinde:

eklemek "resolveJsonModule": trueiçinde"compilerOptions"

Bir hizmet veya bileşende:

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

Ve sonra

private example = exampleData;

15

Bu soruyu, "uzak dosya" olarak adlandırmayı tercih ettiğim web sunucusundan bir dosya okumak yerine gerçekten yerel bir dosyayı okumanın bir yolunu ararken buldum.

Sadece arayın require:

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

Angular-CLI kaynak kodu bana ilham verdi: templateUrlÖzelliği templateve değeri requiregerçek HTML kaynağına yapılan bir çağrı ile değiştirerek bileşen şablonlarını içerdiklerini öğrendim .

AOT derleyicisini kullanıyorsanız, aşağıdakileri ayarlayarak düğüm türü tanımlarını eklemeniz gerekir tsconfig.app.json:

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

3
Kullanmak için burada tartışıldığı gibi çalıştırarak requireyüklemem gerekiyor@types/nodenpm install @types/node --save-dev
jaycer

tüm bu çözümler harika, ancak bu, değerleri kaydetmeme ve dosya içeriğini başlangıçta içe aktarma yapmadan dinamik olarak ayrıştırmama izin verecek tek çözümlerden biri
Aaron Matthews

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

Daha fazla ayrıntı için bu makaleye bakın .


Yerel dosyam için bu kullanımı en kolay olanıydı. "allowSyntheticDefaultImports": trueTsconfig.json 'compilerOptions'ı eklemem gerekiyordu, ancak yalnızca TypeScript için bir linting hatasını durdurmak için gerçek bir hata DEĞİLDİR.
Rin ve Len

Çözüm bu: hackeruna.com/2020/04/27/… bu hata için TS1259
juanitourquiza

3

Bunu dene

Hizmetinize kod yazın

import {Observable, of} from 'rxjs';

json dosyasını içe aktar

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

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

Bileşende

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

1
"ResolJsonModule" ekleyemeyenler için şu an için en iyi cevap: tsconfig'lerine doğru
soni

0

JSON dosyası oluşturalım, navbar.json adını verelim, istediğiniz gibi adlandırabilirsiniz!

navbar.json

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

Şimdi bazı menü verileriyle bir JSON dosyası oluşturduk. Uygulama bileşeni dosyasına gidip aşağıdaki kodu yapıştıracağız.

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;

}

Artık Angular 7 uygulamanız verileri yerel JSON dosyasından sunmaya hazır.

App.component.html adresine gidin ve aşağıdaki kodu içine yapıştırın.

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 ve Angular 6 kullanarak, bu çözümlerden hiçbiri benim için işe yaramadı.

Ne yaptığını işi öğretici takip etmek oldu burada sen adı verilen küçük bir dosya eklemek gerekir diyor njson-typings.d.tsbu içeren, projenize:

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

Bu yapıldıktan sonra, kodlanmış json verilerimi içe aktarabilirdim:

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

ve benim bileşenimde kullan:

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

  constructor() {
    //  Load the data from a hardcoded .json file
    this.employees = employeeData;
    . . . .
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.