16

JSONデータを使用してMVCコントローラーを呼び出すjavascript関数があります。

var specsAsJson = JSON.stringify(specs);
$.post('/Home/Save', { jsonData: specsAsJson });

サーバー側では、コントローラー内で、このエラーを乗り越えることができないようです。

/ Date(1347992529530)/はDateTimeの有効な値ではありません。

この例外は、Deserialize()(以下のメソッドの3行目)を呼び出すと発生します。

    public ActionResult Save(string jsonData)
    {
        var serializer = new JavaScriptSerializer();
        serializer.RegisterConverters(new[] { new TimeSpanJsonConverter() });
        var specs = serializer.Deserialize<List<EquipmentSpecWithParameterlessConstructor>>(jsonData);

        return View("Index", _allTrackerJobs);
    }

私はいくつかのグーグルを行ってきました、そして上記のコードはこれを機能させるための私の最新の試みです(ここからTimeSpanJsonConverterを使用して)。他のアプローチでは、サーバーに日付のみを送信することが示されていますが、いくつかのプロパティとして日付を持つオブジェクトのリストがあります。

これを解決するためのエレガントで一般的に受け入れられているアプローチはありますか、それとも何らかの醜い回避策が必要ですか?これを解決する正しい方法は何ですか?

===================元の質問の終わり===================


編集-JsonConvertを使用してシリアル化することで解決

以下の私の答えを参照してください(この質問のくだらない回避策ではありません)。


編集-安っぽい回避策

ドメインオブジェクトとまったく同じフィールドを使用してDTOを作成しましたが、日付フィールドを逆シリアル化するように文字列を作成しました。デシリアライズできるようになったので、日付を有効な形式に変換して、DTOからドメインオブジェクトを作成できるようにします。

public class EquipmentSpecDto
{
    public string StartTime { get; set; }
    public string EndTime { get; set; }
    // more properties here
}

そして、私は単にDTOを逆シリアル化に使用しました。

var specs = serializer.Deserialize<List<EquipmentSpecDto>>(jsonData);

編集2-JavaScriptの日付を.NETに変換する

完全を期すために、そして私が他の誰かを1時間節約することを期待して、これが私がjavascriptの日付を変換することができた方法です:

    foreach (EquipmentSpecDto specDto in specDtos)
    {
        // JavaScript uses the unix epoch of 1/1/1970. Note, it's important to call ToLocalTime()
        // after doing the time conversion, otherwise we'd have to deal with daylight savings hooey.
        DateTime unixEpoch       = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        Double startMilliseconds = Convert.ToDouble(specDto.StartTime.Substring(6, 13));
        Double endMilliseconds   = Convert.ToDouble(specDto.EndTime.Substring(6, 13));
        DateTime startTime       = unixEpoch.AddMilliseconds(startMilliseconds).ToLocalTime();
        DateTime endTime         = unixEpoch.AddMilliseconds(endMilliseconds).ToLocalTime();
        EquipmentSpec spec       = new EquipmentSpec(startTime, endTime, specDto.Equipment);

        specs.Add(spec);
    }
4

6 に答える 6

13

簡単な答えを見つけました。私のjavascriptでは、JavaScriptSerializerを使用してデータをシリアル化していました。何度もグーグルした後、 JsonConvertを使用してシリアル化する方法を示すこの記事を見つけました。これにより、より.NETに適したDateTimeが使用されるようになります。

年:

var specs = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ViewBag.JobSpecEquipment))

日付は次のようになります。Date(1348017917565)

新しい:

var specs = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(ViewBag.JobSpecEquipment));

日付は次のようになります。2012-09-18T21:27:31.1285861-04:00

ですから、問題は、そもそも私がどのようにシリアル化していたかということでした。JsonConvertを使用すると、バックエンドでの逆シリアル化は簡単に機能しました。

于 2012-09-19T01:29:52.693 に答える
7

このコードをインターネットで見つけました。それは私にとって魅力のように働きました...

function customJSONstringify(obj) {
    return JSON.stringify(obj).replace(/\/Date/g, "\\\/Date").replace(/\)\//g, "\)\\\/")
}
于 2014-02-18T21:19:06.537 に答える
4

Javascriptの日付とさまざまなサーバー側の言語との間の変換で人々を頻繁に捕らえることの1つは、両方がunixスタイルのタイムスタンプ値を理解できる場合でも、JSはマイクロ秒精度のタイムスタンプを使用するのに対し、他のほとんどの言語ではデフォルトであるということです。タイムスタンプの精度は秒単位です。

つまり、他の言語でUNIXタイムスタンプとして認識されるようにするには、Javascriptの1347993132851を1000で割る必要があります。

または、プラットフォームがフォーマットされた日付文字列を受け入れることができる場合は、JavascriptDate()オブジェクトを使用して、タイムスタンプ値をフォーマットされた日付に変換してサーバーに送信します。または、 Date.jsMoment.jsなどのヘルパーライブラリを使用することをお勧めします。

于 2012-09-18T21:34:12.327 に答える
2

JavaScript(EcmaScript)は、ISO-8601標準の簡略化に基づいてDateTime文字列交換形式を定義します。

XMLスキーマは、ISO-8601にも基づいてDateTime文字列交換形式を定義します。

.NETクラスを使用してSystem.Runtime.Remoting.Metadata.W3cXsd2001.SoapDateTime.NETDateTime値からXML形式への変換とその逆の変換を処理すると便利であることがわかりました。

JavaScriptは同じISO-8601標準に基づいているため、JSONの場合にも機能する可能性があります。

于 2012-09-18T21:31:19.870 に答える
2

@Bob Hornの回答を受け取りましたが、うまくいきませんでした。私のRESTサービスはJavascritpt日付を使用しています。参照された回答を拡張メソッドに適合させました。


using System;

namespace Mediatel.Framework
{
    public static class JsonDate
    {
        public static DateTime ConvertToDateTime(this string jsonDate)
        {
            // JavaScript uses the unix epoch of 1/1/1970. Note, it's important to call ToLocalTime()
            // after doing the time conversion, otherwise we'd have to deal with daylight savings hooey.
            DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            Double milliseconds = Convert.ToDouble(jsonDate);
            DateTime dateTime = unixEpoch.AddMilliseconds(milliseconds).ToLocalTime();

            return dateTime;
        }
    }
}
于 2017-02-14T17:00:19.340 に答える
1

エラーを受信した後

/ Date(1347992529530)/はDateTimeの有効な値ではありません。

この置換を使用することは私のために働いた。

var data = ko.toJSON({ objext: obj});
$.ajax({
    url: "/API/API.asmx/SaveObject",
    type: "POST",
    dataType: "json",
    contentType: "application/json; char-utf8;",
    data: data.replace(/\/Date/g, "\\\/Date").replace(/\)\//g, "\)\\\/"),
    success: function (r) {},
    error: function (e) {},
    complete: function () {}
});
于 2018-09-05T11:48:38.703 に答える