Служба Angular 5 для читання локального файлу .json


94

Я використовую Angular 5 і створив службу, використовуючи angular-cli

Що я хочу зробити, це створити службу, яка читає локальний файл json для Angular 5.

Це те, що я маю ... Я трохи застряг ...

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

  }

}

Як я можу це закінчити?


1
angular.io/tutorial/toh-pt6 Наприклад, HttpClientModuleне слід вводити в конструктор.
AJT82,

Відповіді:


132

По-перше, вам доведеться вводити, HttpClientа ні HttpClientModule, по-друге, ви повинні видалити, .map((res:any) => res.json())вам це більше не знадобиться, тому що нове HttpClientдасть вам тіло відповіді за замовчуванням, нарешті, переконайтеся, що ви імпортуєте HttpClientModuleу свій 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");
    }
}

щоб додати це до свого Компонента:

@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
Я отримую "Невирішений тип спостережуваного" ... у цьому рядку "public getJSON (): Observable <any> {"

1
Останнє запитання ... Як я можу отримати ці дані зі свого компонента?

припустимо, якщо я хочу прочитати json id. Що я маю робити? Будь ласка, якщо ви не проти, надайте мені приклад.
user3669026

1
я зіткнувся з помилкою 404 під час отримання json-файлу .... а також слідую за тим самим потоком, що і ваш ..
nagender pratap chauhan

19

У вас є альтернативне рішення - безпосередній імпорт вашого json.

Для компіляції оголосіть цей модуль у своєму файлі typings.d.ts

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

У вашому коді

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

console.log(data_json)

Припустимо, у мене є свій json в assets / abc.json, і я використовую лише один модуль app.module.ts, а потім як оголосити в typing.d.ts та як імпортувати. Будь ласка, допоможіть.
MahiMan

Просто оголосіть модуль у своєму файлі typing.d.ts. І імпортуйте свій JSON у свій клас
Ніколас Лоу-Дюн

Який модуль? Припустимо, я використовую його в додатку. модуль. ts?
MahiMan

6
Коли я це працював, я працював без помилокimport { default as data_json } from '../../path_of_your.json';
Джонас,

1
Чому я отримую "невизначений" у консолі?
Громен

19

Для Angular 7 я виконав ці дії для безпосереднього імпортування даних JSON:

У tsconfig.app.json:

додати "resolveJsonModule": trueв"compilerOptions"

У службі або компоненті:

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

І потім

private example = exampleData;

13

Я знайшов це запитання, коли шукав спосіб по-справжньому прочитати локальний файл, а не читати файл із веб-сервера, який я волів би назвати "віддаленим файлом".

Просто зателефонуйте require:

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

Мене надихнув вихідний код Angular-CLI: я з’ясував, що вони включають шаблони компонентів, замінюючи templateUrlвластивість на templateта значення наrequire виклику фактичного ресурсу HTML.

Якщо ви використовуєте компілятор AOT, вам потрібно додати визначення типу вузла, відрегулювавши tsconfig.app.json:

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

3
Для використання requireмені потрібно було встановити @types/node, запустивши, npm install @types/node --save-devяк обговорювалось тут
jaycer

всі ці рішення чудові, але це одне з єдиних, що дозволить мені зберігати значення та динамічно аналізувати вміст файлу без початкового імпорту
Аарон Метьюз

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

Дивіться цю статтю для більш докладної інформації .


Для мого локального файлу це було найпростішим у використанні. Мені довелося додати "allowSyntheticDefaultImports": trueдо мого tsconfig.json 'compilerOptions', але лише для того, щоб зупинити помилку прив'язки для TypeScript, А НЕ фактичну помилку.
Рін і Лен

Це рішення: hackeruna.com/2020/04/27/… для цієї помилки TS1259
juanitourquiza

2

Спробуйте це

Напишіть код у своєму сервісі

import {Observable, of} from 'rxjs';

імпортувати файл JSON

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

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

В компоненті

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

Найкраща відповідь на даний момент для тих, хто не може додати "resolJsonModule": true у свій tsconfig
soni

0

Давайте створимо файл JSON, ми його назвемо navbar.json, ви можете назвати його як завгодно!

navbar.json

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

Зараз ми створили файл JSON з деякими даними меню. Ми перейдемо до файлу компонента програми та вставимо код нижче.

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;

}

Тепер ваш додаток Angular 7 готовий обслуговувати дані з локального файлу JSON.

Перейдіть до app.component.html і вставте в нього наступний код.

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 та Angular 6, жодне з цих рішень не працювало для мене.

Що вдалося - це дотримуватися навчального посібника тут, який говорить, що вам потрібно додати невеликий файл, викликаний njson-typings.d.tsдо вашого проекту, що містить таке:

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

Як тільки це було зроблено, я міг просто імпортувати свої жорстко закодовані дані json:

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

і використовувати його в моєму компоненті:

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

  constructor() {
    //  Load the data from a hardcoded .json file
    this.employees = employeeData;
    . . . .
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.