Angular 5 Service读取本地.json文件


94

我正在使用Angular 5,并且已经使用angular-cli创建了服务

我想要做的是创建一个为Angular 5读取本地json文件的服务。

这就是我所拥有的...我有点卡住了...

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

Answers:


128

首先,你必须注入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
我得到“未解决的类型可观察的” ......在这条线上的“公共的getJSON():可观察到<任何> {”

1
最后一个问题...如何从组件中获取这些数据?

假设我想阅读json id。我该怎么办?如果您不介意,请提供我的示例。
user3669026

1
我曾面临404错误而获取JSON文件....也跟着像你一样流..
nagender普拉塔普肖汉

19

您有另一种解决方案,直接导入json。

要进行编译,请在您的Types.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,然后如何在type.d.ts中声明以及如何导入。请帮忙。
MahiMan '11

只需在您的type.d.ts文件中声明该模块即可。并导入JSON到类
萨科法沙丘

哪个模块?假设我在应用程序中使用它。模块。ts?
MahiMan '17

6
当我这样做的时候,我import { default as data_json } from '../../path_of_your.json';
使它

1
为什么在控制台中出现“未定义”?
Gromain

19

对于Angular 7,我按照以下步骤直接导入json数据:

在tsconfig.app.json中:

添加"resolveJsonModule": true"compilerOptions"

在服务或组件中:

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

然后

private example = exampleData;

13

我在寻找一种真正读取本地文件而不是从Web服务器读取文件的方法时发现了这个问题,我宁愿将其称为“远程文件”。

只需致电require

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

Angular-CLI源代码启发了我:我发现它们包含组件模板,方法是通过调用实际HTML资源来替换templateUrl属性template和值来替换组件模板require

如果使用AOT编译器,则必须通过调整来添加节点类型definitons 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的掉毛错误,而不是实际的错误。
Rin和Len

这是解决方案: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);
    })        
}

对于那些无法在其tsconfig中添加“ resolveJsonModule”的用户,此刻的最佳答案
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;
    . . . .
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.