将数据转换为对象数组的请求

Posted

技术标签:

【中文标题】将数据转换为对象数组的请求【英文标题】:Request with data converted to array of objects 【发布时间】:2017-10-15 15:04:00 【问题描述】:

我正在执行请求,它正确地返回了一个 Observable,但是我想让这些返回的对象为 Setor 类型,我正在我的 ServiceBase 中执行一个通用方法,传递要通过返回的对象类型泛型。

Setor 类:

import  UUID  from 'angular2-uuid'

export class Setor 
    descricao: string;
    id: UUID;

setor.component.ts:

import  element  from 'protractor';
import  Component, OnInit  from '@angular/core';

import  SetorService  from './service/setor.service';
import  Setor  from "app/retaguarda/setor/model/setor";

@Component(
  selector: 'app-setor',
  templateUrl: './setor.component.html',
  styleUrls: ['./setor.component.css']
)

export class SetorComponent implements OnInit 

  setor: Setor;

  private setores: Setor[]; // Lista de setores

  constructor(public setorService: SetorService) 
  

  ngOnInit() 
    this.setor = new Setor();
  

  obterTodos(form) 
    let t = this.setorService.obterSetores().subscribe(setores => this.setores = setores);
      console.log(t);
  

setor.service.ts:

import  Observable  from 'rxjs/Observable';
import  BaseService  from './../../../shared/service/base/base.service';
import  Injectable  from '@angular/core';
import  Setor  from "app/retaguarda/setor/model/setor";
import  Http  from "@angular/http";

@Injectable()
export class SetorService extends BaseService 

  uriApi: string = 'setor';

  constructor(httpService: Http) 
    super(httpService);
  

  obterSetores(): Observable<Setor[]> 
    return this.obterTodos<Setor>('setor');
  

base.service.ts:

import  Injectable  from '@angular/core';
import  Http, Response, Headers, RequestOptions, URLSearchParams  from '@angular/http';
import  Observable  from 'rxjs/Observable';

// Observable class extensions
import 'rxjs/add/observable/of';
import 'rxjs/add/observable/throw';
import 'rxjs'

// Observable operators
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';

@Injectable()
export class BaseService 

  serviceUrl: string = 'http://localhost:5780/api/';
  headers: Headers;
  options: RequestOptions

  constructor(private httpService: Http) 
    this.headers = new Headers(
      'Content-Type': 'application/json',
      'Accept': 'q=0.8;application/json;q=0.9'
    );
    this.options = new RequestOptions( headers: this.headers );
  

  private getAll<T>(url: string): Observable<T[]> 
    return this.httpService
      .get(url)
      .map(res => res.json() as T[])
      .catch(this.handleError);
  

  protected obterTodos<T>(url: string): Observable<T[]> 
    return this.getAll(this.serviceUrl + url);
  

  private post<T>(url: string, data: T): Observable<T> 
    let jsonContent = JSON.stringify(data);
    return this.httpService
      .post(url, jsonContent, this.options)
      .map(this.extractData)
      .catch(this.handleError);
  

  private extractData<T>(res: Response) 
    let body = res.json() as any;
    return body || ;
  

  private handleError(error: any) 
    let errMsg = (error.message) ? error.message :
      error.status ? `$error.status - $error.statusText` : 'Server error';
    console.error(errMsg);
    return Observable.throw(errMsg);
  

JSON 返回:

    [
        
        "Descricao": "teste 1",
        "Id": "4b78ade1-39a1-11e7-a8f1-a41f72fdda5d"
        ,
        
        "Descricao": "teste 2",
        "Id": "4b7cb16f-39a1-11e7-a8f1-a41f72fdda5d"
        ,
        
        "Descricao": "teste 3",
        "Id": "4b807449-39a1-11e7-a8f1-a41f72fdda5d"
        
   ]

缺少什么以使 JSON 中的返回可反序列化以用于 Setor 类?

【问题讨论】:

有什么问题? @echonax 答案是对象数组。我需要返回一个 Setor 数组 你的意思是你的console.log(t); 没有给你想要的吗? @echonax T 是对象数组,应该是扇区数组。这就是强类型返回的确切问题。 为什么不直接使用接口,或者使用类有什么特殊原因?如果是这样,您必须首先修改该类并在其中添加一个构造函数。 【参考方案1】:

如果你想使用 Classes ...首先你需要在这种情况下为你的类添加一个构造函数,以便我们可以映射到 Setor 类型的新对象。

export class Setor 
  constructor(
    public descricao: string;
    public id: UUID;
  ) 

然后我们必须从您的响应中映射每个Setor,因为属性不匹配,否则我们可以使用Object.assign 而无需明确说明属性。

obterSetores(): Observable<Setor[]> 
  return this.obterTodos<Setor>()
    .map(res => res.map(x => new Setor(x.Descricao, x.Id)))

应该差不多了:)

DEMO

【讨论】:

完美运行!!!!!!但是属性是空的,只需要更正这个就一切正常了! 太好了,很高兴听到!如果属性是空的,可能还有属性不同的问题吗?由于 plunker 使用提供的代码可以正常工作。你只需要仔细检查这些属性,希望你能弄清楚。如果没有,请在您重新创建问题的地方分叉,然后大声喊叫,我可以看看:)

以上是关于将数据转换为对象数组的请求的主要内容,如果未能解决你的问题,请参考以下文章

将数据数组转换为具有属性的对象[重复]

将表单数据数组对象转换为 JSON [重复]

将 Firebase 数据对象转换为数组

熊猫数据框如何将对象转换为数组并提取数组值

错误无法使用 Mulesoft 将数组强制转换为对象

使用 ramda 将数组数组转换为数组对象