2017-03-31 169 views
0

我正在製作一個angular2應用程序,現在我試圖將一個字符串解析爲一個對象。基本上發生了什麼是我傳遞一個字符串,我想將它轉換成一個獨特的對象稱爲IDate。 我以這種格式「2017-02-27T00:00:00」得到一個字符串,但是我想它作爲IDate()。所以到目前爲止我所做的是創建一個IDate類,它接受一個字符串並將其轉換爲日期。我創建了一個Mock類來將響應映射到對象。但是,當我打印對象,我看到值保持字符串。任何人都知道如何實現我所說的?我基本上試圖映射字符串到一個對象,當我映射控制器的響應。我可以在像resposne.map(r.time => new Date(r.time));這樣的操作中做到這一點,但我寧願將它映射到響應中,因爲我在其他地方稱這些控制器,我不想在單獨的頁面上重複該過程。這可以做到嗎?將字符串轉換爲對象

控制器

 return Json(new { Number = 1, Time= "2017-02-27T00:00:00" }); 

客戶

class IDate { 
    value: Date; 
    contructor(value) { 
     this.value = new Date(value); 
    } 
} 
class Mock { 
    number: number; 
    time: IDate; 
} 
mock: Mock = null; 

this.service.get() 
      .subscribe(
      response => { 
       console.log("Test response"); 
       this.mock = response; 
       console.log(this.mock); 
      }, 

控制檯

Object 
    number:1 
    time:"2017-02-27T00:00:00" 
    __proto__:Object 
+0

這工作,如果我傳遞一個對象的字符串格式,即時嘗試傳遞一個字符串並將其轉換爲一個對象 – John

+0

[日期(dateString)和新日期(日期字符串)]之間的可能重複](http:// stackoverflow .com/questions/3505693/difference-between-datedatestring-and-new-datedatestring) –

+0

@ScottMarcus沒有什麼即時嘗試做,請再次閱讀問題,讓我知道如果它不明確。 – John

回答

0

我假設你正在從你的REST API JSON字符串。如果這適用於您的情況,您可以使用reviver。下面是使用reviver一個簡單的方法:

JSON.parse(jsonString, function (key, value) { 
    if (key === "time") 
     return new Date(value); 
    return value; 
}) 

這裏是鏈接到正在運行的小提琴:https://jsfiddle.net/sayan751/Lzb8u638/


更新基於OP的comment

轉換一個通用對象爲特定類的實例,是不是很簡單。請注意,​​不會將response轉換爲Mock類的實例(請參閱新的小提琴鏈接)。

您可以使用Object.assign,但它可能不適用於類型轉換。

此外,我認爲你的情況,你的JavaScript代碼收到JSON對象{Number:number, Time:string}的架構不匹配的Mock模式:{number:number, time:{value:Date}}

在這種情況下,最好(根據我的意見)爲Mock編寫自定義轉換器。一種簡單的方法可以如下。有關詳細代碼,請參閱新的小提琴鏈接。

class Mock { 
    number: number; 
    time: IDate; 

    public static create(obj):Mock{ 
     let retVal = new Mock(); 
     retVal.number=obj.number; 

     if(typeof obj.time === "string") 
     retVal.time = new Date(obj.time); //better to use moment in this case, if possible 
     else if(obj.time instanceof Date) 
     retVal.time = obj.time; 

     return retVal; 
    } 
} 

var jsonObj = { number: 1, time: "2017-02-27T00:00:00" }; 

var obj = Mock.create(jsonObj); 

鏈接撥弄:https://jsfiddle.net/sayan751/mxoqqc5a/

希望這有助於。

+0

我得到一個JSON對象並將其映射到模擬類別打字稿,我想字符串數據是一個日期,但由於某種原因,它沒有被映射到一個。 – John

+0

@John我已經更新了答案。希望能幫助到你。 –

+0

我沒有實例化對象,我試圖改變它的值時,它被映射,但我看到你說這是不可能的。 – John