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.