Сервис Angular 5 для чтения локального файла .json


99

Я использую 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

Ответы:


133

Во-первых, вам нужно ввести, 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
Я получаю "Unresolved Type Observable" ... в этой строке "public getJSON (): Observable <any> {"

1
Последний вопрос ... Как мне получить эти данные из моего компонента?

предположим, если я хочу прочитать json id. Что я должен сделать? Если вы не возражаете, приведите пример.
user3669026

1
я столкнулся с ошибкой 404 при загрузке файла json .... а также следую тому же
процессу, что

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 и как импортировать. Пожалуйста помоги.
Mahi

Просто объявите модуль в своем файле typing.d.ts. И импортируйте свой JSON в свой класс
Николас Лоу-Дюн

Какой модуль? Предположим, я использую его в приложении. модуль. ts?
Mahi

6
Я получил это работать без ошибок , когда я сделалimport { default as data_json } from '../../path_of_your.json';
Jonas

1
Почему в консоли отображается "undefined"?
Gromain

19

Для Angular 7 я выполнил следующие шаги, чтобы напрямую импортировать данные json:

В tsconfig.app.json:

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

В службе или компоненте:

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

А потом

private example = exampleData;

14

Я обнаружил этот вопрос, когда искал способ действительно прочитать локальный файл вместо чтения файла с веб-сервера, который я бы предпочел назвать «удаленным файлом».

Просто позвоните 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

3

Попробуй это

Напишите код в свой сервис

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

1
Лучший ответ на данный момент для тех, кто не может добавить "resolveJsonModule": 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.