ローカルの.jsonファイルを読み取るAngular 5サービス


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 2017年

回答:


128

最初に注入しHttpClient、Not 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
私は、JSONファイルをフェッチ中に404エラーに直面....も...あなたのような同じ流れに従ってきた
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)

私のアセットがassets / abc.jsonにあり、1つのモジュールapp.module.tsだけを使用して、typing.d.tsで宣言する方法とインポートする方法を想定します。助けてください。
MahiMan 2017年

入力するモジュールを、typing.d.tsファイルで宣言するだけです。そして、JSONをクラスにインポートします
Nicolas Law-Dune

どのモジュール?アプリで使用しているとします。モジュール。ts?
MahiMan 2017年

6
エラーが発生することなくこれが機能するようになりましたimport { default as data_json } from '../../path_of_your.json';
jonas

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コンパイラを使用する場合は、次のように調整してノードタイプの定義を追加する必要がありますtsconfig.app.json

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

3
使用するrequireには、ここで説明さ@types/nodeれてnpm install @types/node --save-devいるように実行してインストールする必要がありました
jaycer

これらのソリューションはすべて素晴らしいですが、これは、値を保存して、最初のインポートなしでファイルの内容を動的に解析できる唯一のソリューションの1つです
Aaron Matthews

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

詳細については、この記事を参照してください


私のローカルファイルでは、これが最も簡単に使用できました。"allowSyntheticDefaultImports": truetsconfig.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;
    . . . .
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.