TypeScript / Angular 2创建动态对象反序列化器

时间:2017-07-05 14:49:36

标签: json angular typescript

所以我来自C#的背景,我可以用动态和反思的方式做事,我正在尝试将它应用到我正在编写的TypeScript类中。 一些背景,我正在将应用程序转换为Web应用程序,而后端开发人员根本不想更改后端以适应Json。所以他将把Json看作是这样发送给我的:

{
 Columns: [
  {
   "ColumnName": "ClientPK",
   "Label": "Client",
   "DataType": "int",
   "Length": 0,
   "AllowNull": true,
   "Format": "",
   "IsReadOnly": true,
   "IsDateOnly": null
  }
 ],
 Rows:[
  0
 ]
}

我希望编写一个扩展Response的Angular类,它将有一个名为JsonMinimal的特殊方法,它将理解这些数据并为我返回一个对象。

import { Response } from "@angular/http";

export class ServerSource
{ 
    SourceName: string;
    MoreItems: boolean;
    Error: string;
    ExtendedProperties: ExtendedProperty[];
    Columns: Column[];
}    

export class ServerSourceResponse extends Response
{ 



    JsonMinimal() : any
    { 

        return null; //Something that will be a blank any type that when returned I can perform `object as FinalObject` syntax
    }


}

我知道StackOverflow不是要求问题的完整解决方案,所以我只想问一下这个示例数据的一个例子,并创建一个动态响应,TypeScript不会对我大喊大叫。我不知道该怎么做,这个开发人员有数千个服务器端方法,所有这些方法都以JSON或XML输出的形式返回字符串。我基本上是在寻找一种方法来获取他的列数据并将其与正确的行数据相结合,然后拥有一个更大的对象来保存这些组合对象。

此数据映射到基本对象之后的用例就是这样的。 例如:

var data = result.JsonMinimal() as LoginResponse; <-- Which will map to this object correctly if all the data is there in a base object.

var pk = data.ClientPK.Value;

1 个答案:

答案 0 :(得分:2)

我不确定我理解,但您可能想先尝试一种简单的方法。 Angular的http get方法返回一个observable,它可以自动将响应映射到一个对象或一个对象数组。它也足以执行一些自定义映射/转换。你可能想先看一下。

以下是一个例子:

getProducts(): Observable<IProduct[]> {
    return this._http.get(this._productUrl)
        .map((response: Response) => <IProduct[]> response.json())
        .do(data => console.log('All: ' +  JSON.stringify(data)))
        .catch(this.handleError);
}

这里我将json响应映射到我用IProduct接口定义的Product对象数组。因为这只是一个&#34; lambda&#34;类型函数,我可以在这里添加任意数量的代码来转换数据。