2017-03-31 16 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

[Date(dateString)とnew Date(dateString)の差異]の可能な複製(http:// stackoverflow .com/questions/3505693/dateatestestringとnew-datedatestringの違い) –

+0

@ScottMarcus何をしようとしているのではないか、質問をもう一度読んで、わからない場合は教えてください。 – John

答えて

0

私はあなたのREST APIからJSON文字列を取得していると仮定しています。これがあなたの場合に当てはまる場合は、reviverを使用することができます。ここでreviverを使用するための単純なアプローチです:https://jsfiddle.net/sayan751/Lzb8u638/

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

ここで実行しているフィドルへのリンクです。 OPのcomment

は、特定のクラスのインスタンスへの一般的なオブジェクトの変換に基づいて更新


非常に単純ではありません。​​はresponseMockクラスのインスタンスに変換しないことに注意してください(新しいフィドルリンクを参照)。

Object.assignを使用できますが、タイプ変換では機能しない可能性があります。

JavaScriptコードで受け取ったjsonオブジェクト{Number:number, Time:string}のスキーマが、Mock{number:number, time:{value:Date}}のスキーマと一致しません。

この場合、Mockのカスタムコンバータを作成するのが最善の方法です(私の考えによれば)。 1つの単純なアプローチは以下のようになります。詳細なコードについては、新しいフィドルリンクを参照してください。このことができますhttps://jsfiddle.net/sayan751/mxoqqc5a/

希望を:いじるする

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); 

リンク。

+0

JSONオブジェクトを取得しています.Mockクラスにマッピングされていますvai typescript私は文字列データを日付にしたいが、何らかの理由でそれが1にマップされないようにする。 – John

+0

@John私は答えを更新しました。それが役に立てば幸い。 –

+0

私はオブジェクトをインスタンス化していません、マップされたときに値を変更しようとしていますが、あなたはそれが不可能だと言っています。 – John

関連する問題