2017-07-05 122 views
0

所以我来自C#的背景,我可以在动态和反射的方式做事情,我试图将它应用于我正在编写的TypeScript类。 一些背景知识,我正在将应用程序转换为一个Web应用程序,后端开发人员不想完全改变后端以适应Json。所以,他会送我回来的JSON看起来像这样:TypeScript/Angular 2创建一个动态对象解串器

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

我期待写一个角类,它扩展响应,将有一个名为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上不是要求对问题的完整的解决方案,所以我只问什么就是一例服用此示例数据和创建打字稿不会在我喊动态响应。我不知道该做什么,这个开发人员有成千上万的服务器端方法,并且都以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; 
+0

你为什么要做'var finalObject = Object.assign({},rawObject);'?.另外,什么是“LoginResponse”?我想你可能在这里过于复杂,但我不清楚你想达到什么目的。 – Hinrich

+0

我还没有真正开始使用任何有用的代码,我将它从代码示例中删除。 –

+0

请注意,名为'JsonMinimal()'的函数不返回JSON,而是返回一个对象。 JSON是一种字符串格式。 –

回答

1

我不能完全肯定我理解,但你可能想先尝试一种简单的方法。 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接口中定义的产品的对象的阵列。由于这只是一个“lambda”类型的函数,我可以在这里添加任意数量的代码来转换数据。