2017-09-03 61 views
0

我嘗試對對象施加json響應時出現問題,我的對象的所有屬性都是字符串是正常的?Angular:作爲對象模型不工作的腳本投射JSON響應

這裏是我的Ajax請求:

public getSingle = (keys: any[]): Observable<Badge> => { 
     return this._http.get(this.actionUrl + this.getKeysUrl(keys)) 
      .map((response: Response) => response.json() as Badge) 
      .catch(this.handleError); 
} 

這裏是我的徽章型號:

export interface Badge { 
     badgeNumber: number; 
     authorizationLevel: number; 
     endOfValidity: Date; 
    } 

而且這裏是我所說的服務功能,我現在面臨這個問題:

this._badgeService.getSingle(this.ids).subscribe(
     (badge: Badge) => { 
     console.log(typeof(badge.endOfValidity)); // <-- returning string and not Date 
     }, 
     error => console.log(error); 
     }); 
+0

'as Badge'是一個*斷言*,它實際上並沒有施放任何東西。您需要自己從JSON數據創建一個新的Badge對象。 – jonrsharpe

+0

我明白了,你會介意在我的案例中告訴我最好的方法嗎? –

回答

2

這有點棘手解釋:

Date,這意味着需要通過構造函數調用創建Date類型的值。換句話說,使用new Date(...)創建一個類實例。

Response.json方法將只返回JSON格式的對象,並且不包含任何類的實例,只包含key:屬性的映射。

因此,您需要做的是手動將從.json()返回的值轉換爲Base對象。這可以按如下方式完成:

public getSingle = (keys: any[]): Observable<Badge> => { 
     return this._http.get(this.actionUrl + this.getKeysUrl(keys)) 
      .map(r => r.json()) 
      .map(v => <Badge>{ 
       badgeNumber: v.badgeNumber, 
       authorizationLevel: v.authorizationLevel, 
       endOfValidity: new Date(v.endOfValidity) 
       // preferably this string should be in ISO-8601 format 
      }) 
      //the mapping step can be done in other ways most likely 
      .catch(this.handleError); 
} 
+0

我發現問題其實更清楚。我嘗試了你的解決方案並且像魅力一樣工作,但是當我調用方法時,是否有任何方法可以從我的組件中完成它?因爲我的服務類是通用的,所以如果你仍然想從服務中返回Observable 而沒有手動映射,那麼對象可以是任何基本的東西 –

+0

,那麼你需要將endOfValidity的類型改爲字符串,並像在零件。 –

+0

嘿@ Jota.Toledo getKeysUrl是什麼?爲什麼2個網址?即時通訊從1個網址檢索一個JSON對象列表,另一個是什麼? –