Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como tratar resposta do Json em formato diferente

Minha dúvida é similar à: https://cursos.alura.com.br/forum/topico-melhor-maneira-de-pegar-um-dados-de-uma-api-que-retorna-um-page-262858 Contudo a resposta de lá não solucionou o meu problema.

Fiz uma chamada a uma API que retorna o jason similar a este exemplo:

{
    "dados": [
        {
            "id": 101010,
            "nome": "Fulano de tal",
            "email": "fulano@teste.com"
        },
        {
            "id": 202020,
            "nome": "Beltrano de tal",
            "email": "beltrano@teste.com"
        },
        {
            "id": 303030,
            "nome": "Sicrano de tal",
            "email": "sicrano@teste.com"
        }

    ]
}

Eu entendi a parte da Interface que o colega sugeriu na postagem citada, mas como eu acesso no componente.ts

Quando faço isso, dá erro no resposta.dados.

  ngOnInit(): void {
    this.service.listar().subscribe((resposta) =>{
      this.pessoas = resposta.dados
    })
  }

Ele retorna o erro: Property 'dados' does not exist on type 'Pessoa[]'

A interface ficou assim:

export interface Pessoa {
   dados: Pessoa[]
}
export interface Pessoa{
   id: number,
   nome: string,
   email: string
}
4 respostas

Olá Luis, tudo bem?

Entendi que você está com dificuldades para acessar os dados retornados pela API que você chamou, certo?

Pelo que entendi, o erro que está ocorrendo é porque a propriedade "dados" não está sendo reconhecida como parte da resposta da API. Para resolver isso, você precisa ajustar a sua interface para que ela reflita corretamente a estrutura do JSON que está sendo retornado.

No caso, a sua interface Pessoa está definindo a propriedade "dados" como um array de Pessoa, quando na verdade "dados" é o array que contém as informações das pessoas. Então, a sua interface deveria ser assim:

export interface RespostaAPI {
  dados: Pessoa[];
}

export interface Pessoa {
  id: number;
  nome: string;
  email: string;
}

E no seu componente, você deve ajustar o código para acessar a propriedade "dados" da resposta da API:

ngOnInit(): void {
  this.service.listar().subscribe((resposta: RespostaAPI) => {
    this.pessoas = resposta.dados;
  });
}

Dessa forma, o TypeScript vai reconhecer corretamente a estrutura da resposta da API e você poderá acessar os dados normalmente.

Espero ter ajudado e bons estudos!

Entendi a sua resposta, mas não funcionou.

Vou colocar abaixo o código completo. Lembrando que na minha pergunat eu modifiquei o nome do objeto, mas agora está com outro nome.

A interface:

export interface RespostaAPI {
   dados: Deputados[]
}
export interface Deputados{
   id: number,
   nome: string,
   siglaPartido: string,
   siglaUf: string,
   idLegislatura: number,
   urlFoto: string,
   email: string
}

O componente.ts:

import { Component, OnInit } from '@angular/core';
import { DemocraciaService } from '../democracia.service';
import { Deputados, RespostaAPI } from 'src/app/interfaces/deputados';

@Component({
  selector: 'app-deputados',
  templateUrl: './deputados.component.html',
  styleUrls: ['./deputados.component.scss']
})
export class DeputadosComponent implements OnInit {

  deputados: Deputados[] = [];

  constructor(private service: DemocraciaService) { }
  
  ngOnInit(): void {
    this.service.listar().subscribe((resposta: RespostaAPI) =>{
      console.log(resposta.dados)
    })
  }

}

O erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A Resposta da API:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Consegui resolver.

Alterei também o service, colocando o RespostaAPI:

  listar(): Observable<RespostaAPI>{
    return this.http.get<RespostaAPI>(this.api)
  }

Agora funcionou.

Ai sim. Que bom que conseguiu resolver! Valeu o retorno :)