web-dev-qa-db-ja.com

タイプスクリプトのjsonレスポンスからDateオブジェクトを取得する方法

ここに私のjsonがあります:

{
  "data": [
    {
      "comment": "3541",
      "datetime": "2016-01-01"
    }
  ]
}

モデルは次のとおりです。

export class Job {
    constructor(comment:string, datetime:Date) {
        this.comment = comment;
        this.datetime = datetime;
    }

    comment:string;
    datetime:Date;
}

クエリ:

getJobs() {
        return this._http.get(jobsUrl)
            .map((response:Response) => <Job[]>response.json().data)
}

問題は、Job[]私はdatetimepropertyがDateであることを期待していますが、それは文字列です。 Dateオブジェクトにキャストすべきではありませんか?ここで何が欠けていますか?

21
Vladimir Nani

@Gunterは絶対に正しいです。私が追加したい唯一のものは、実際には、日付プロパティを文字列ではなく日付として保持するjsonオブジェクトをデシリアライズする方法です(参照された投稿から、このアプローチはそれほど簡単ではありません)。

私の試みは次のとおりです。

export class Helper
{
    public static Deserialize(data: string): any
    {
        return JSON.parse(data, Helper.ReviveDateTime);
    }

    private static ReviveDateTime(key: any, value: any): any 
    {
        if (typeof value === 'string')
        {
            let a = /\/Date\((\d*)\)\//.exec(value);
            if (a)
            {
                return new Date(+a[1]);
            }
        }

        return value;
    }
}

たとえば、このアプローチは、dateReviverの例の JSON.parse Function で確認できます。

お役に立てれば。

18
Amid

TS/JSにとって、この値が日付であることを知る方法はありません。これは文字列であり、そのように扱われます。他のデータ型は区別できますが、JSONは日付の特別なサポートを提供しません。手動で変換する必要があります。

たとえば、JSONを使用して日付を転送および変換する方法については、この説明を参照してください Microsoft JSON日付をフォーマットするにはどうすればよいですか?

6