Serviço Angular 5 para ler arquivo .json local

94

Estou usando o Angular 5 e criei um serviço usando o angular-cli

O que eu quero fazer é criar um serviço que leia um arquivo json local para o Angular 5.

Isso é o que eu tenho ... Estou um pouco preso ...

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

  }

}

Como posso terminar isso?

dhilt
fonte
1
angular.io/tutorial/toh-pt6 Por exemplo, HttpClientModulenão deve ser injetado no construtor.
AJT82

Respostas:

128

Primeiro você tem que injetar HttpCliente não HttpClientModule, a segunda coisa que você tem que remover .map((res:any) => res.json())você não vai precisar mais porque o novo HttpClientvai te dar o corpo da resposta por padrão, finalmente certifique-se de importar HttpClientModuleem seu 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");
    }
}

para adicionar isso ao seu componente:

@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);
        });
   }
}
Bougarfaoui El houcine
fonte
1
Estou recebendo "Tipo não resolvido observável" ... nesta linha "public getJSON (): Observável <qualquer> {"
1
Uma última pergunta ... Como faço para esses dados do meu componente?
suponha que se eu queira ler a id json. O que eu tenho que fazer? Por favor, se você não se importa, me dê o exemplo.
user3669026
1
Eu enfrentei o erro 404 ao buscar o arquivo json .... e também siga o mesmo fluxo como o seu ..
nagender pratap chauhan
19

Você tem uma solução alternativa, importando diretamente seu json.

Para compilar, declare este módulo em seu arquivo typings.d.ts

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

Em seu código

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

console.log(data_json)
Nicolas Law-Dune
fonte
Suponha que eu tenha meu json em assets / abc.json, e usando apenas um módulo app.module.ts, como declarar em digitando.d.ts e como importar. Por favor ajude.
MahiMan
Apenas declare o módulo em seu arquivo digitando.d.ts. E importe seu JSON para sua classe
Nicolas Law-Dune
Qual módulo? Suponha que eu o esteja usando no aplicativo. módulo. ts?
MahiMan de
6
Fiz isso funcionar sem erros quando o fizimport { default as data_json } from '../../path_of_your.json';
jonas
1
Por que estou ficando "indefinido" no console?
Gromain
19

Para o Angular 7, segui estas etapas para importar dados json diretamente:

Em tsconfig.app.json:

adicionar "resolveJsonModule": trueem"compilerOptions"

Em um serviço ou componente:

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

E depois

private example = exampleData;
Jaycer
fonte
13

Eu encontrei essa pergunta ao procurar uma maneira de realmente ler um arquivo local em vez de ler um arquivo do servidor web, que prefiro chamar de "arquivo remoto".

Basta ligar para require:

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

O código-fonte Angular-CLI me inspirou: descobri que eles incluem modelos de componentes substituindo a templateUrlpropriedade por templatee o valor por uma requirechamada para o recurso HTML real.

Se você usar o compilador AOT, terá que adicionar as definições de tipo de nó ajustando tsconfig.app.json:

"compilerOptions": {
  "types": ["node"],
  ...
},
...
espinha de peixe
fonte
3
Para usar, requireeu precisava instalar @types/nodeexecutando npm install @types/node --save-devconforme discutido aqui
jaycer
todas essas soluções são ótimas, mas esta é uma das únicas que me permite salvar os valores e analisar o conteúdo do arquivo dinamicamente sem uma importação inicial
Aaron Matthews
6
import data  from './data.json';
export class AppComponent  {
    json:any = data;
}

Veja este artigo para mais detalhes .

Ole
fonte
Para meu arquivo local, isso foi mais fácil de usar. Tive de adicionar "allowSyntheticDefaultImports": true'compilerOptions' ao meu tsconfig.json, mas apenas para impedir um erro de linting para TypeScript, NÃO um erro real.
Rin e Len
Esta é a solução: hackeruna.com/2020/04/27/… para este erro TS1259
juanitourquiza
2

Tente isto

Escreva o código em seu serviço

import {Observable, of} from 'rxjs';

importar arquivo json

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

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

Em componente

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

fonte
Melhor resposta para o momento para aqueles que não são capazes de adicionar "resolveJsonModule": true em seu tsconfig
soni
0

Vamos criar um arquivo JSON, vamos chamá-lo de navbar.json, você pode nomeá-lo como quiser!

navbar.json

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

Agora criamos um arquivo JSON com alguns dados do menu. Iremos para o arquivo de componente do aplicativo e colar o código abaixo.

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;

}

Agora, seu aplicativo Angular 7 está pronto para servir os dados do arquivo JSON local.

Vá para app.component.html e cole o seguinte código nele.

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>
Surya R Praveen
fonte
0

Usando Typescript 3.6.3 e Angular 6, nenhuma dessas soluções funcionou para mim.

O que funcionou foi seguir o tutorial aqui que diz que você precisa adicionar um pequeno arquivo chamado njson-typings.d.tsao seu projeto, contendo este:

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

Feito isso, eu poderia simplesmente importar meus dados JSON codificados:

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

e usá-lo em meu componente:

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

  constructor() {
    //  Load the data from a hardcoded .json file
    this.employees = employeeData;
    . . . .
  }
Mike Gledhill
fonte