0

Q: Json.NET でこの json 日付構造を C# DateTime に正常に変換するにはどうすればよいですか?

こんにちは、DDP プロトコルを使用して、既存の Meteor.js アプリのメソッド呼び出しからの戻り値を、既知の厳密な戻り構造に逆シリアル化しようとしています。

私はダイナミクスを使用して最も基本的なことを実装していますが、厳密な構造に移行して、C# 側でタイプ セーフとインテリセンスを活用しています。

ただし、javascripts Date() の ddp シリアル化構造を使用して、Javascripts Date() を C#s DateTime に正常に逆シリアル化することに失敗しています。

"when": {
        "$date": 1406886657338
 }

Q: Json.NET でこの json 日付構造を C# DateTime に正常に変換するにはどうすればよいですか?

「プロトコル」ミドルウェアが可能であれば、DateTime から DDP の Date() を使用することもできます。

私の構造:

namespace xxxx.API.Structures
{
    public struct loginParams
    {
        public string email;
        public string apiClient;
    }

    public struct loginReturn
    {
        public string result;
        public string session;
        public string email;
        public string user;
        public DateTime when;
        public string client;
    }
}

loginReturn に変換したい戻り値:

xxxx.DDP.Client.DDPClient.ConnectGS.AnonymousMethod__1 (err=(null), res={{
  "result": "sucess",
  "session": "v3gozkHgceoqGqsfd",
  "email": "xxxx@gmail.com",
  "user": "hueun3s8rKQWsoQDT",
  "server": "Lnf3vAFaeoCiMWriY",
  "when": {
    "$date": 1406886657338
  },
  "client": "OfficialxxxxPlugin"
}}) in /Volumes/2TB/Files/Documents/Dropbox/Development/C#/xxxx/xxxx/xxxxAPI/xxxx.DDP.Client/DDPClient.cs:43
4

2 に答える 2

0

JSON 応答の値は Unix タイムスタンプです。1970 年 1 月 1 日 00:00:00 UTC からのミリ秒数を示します。

したがって、次のことができます。

String JSONDate = "1406886657338";
DateTime when = new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(Convert.ToDouble(JSONDate));
于 2014-08-01T14:54:48.960 に答える
0

これは考えられる最善の解決策ではなく、私が議論したかったトピックに実際には何も追加しませんが、この特定の問題については、ここで機能する修正があります.

private static Regex _dollarDateRegex = new Regex ("\"\\$date\\\":\\s?(\\d+)");
if (message.Contains ("$date")) {
                var matches = _dollarDateRegex.Matches (message);
                foreach (Match match in matches) {
                    string date = match.Groups [1].Value;
                    int startOfDate = message.IndexOf ("$date\":" + date, StringComparison.CurrentCulture);
                    int startOfObject = startOfDate;
                    int endOfObject = startOfDate;
                    // skip to first { behind
                    while (message [startOfObject--] != '{') {
                    }
                    // skip to last } in front
                    while (message [endOfObject++] != '}') {
                    }                       
                    var diff = endOfObject - startOfObject;
                    StringBuilder s = new StringBuilder (message);
                    s.Remove (startOfObject, diff);
                    s.Insert (startOfObject, ": new Date(" + date + ")");
                    message = s.ToString ();
                }
            }

これにより、次の結果が得られます。

{
   ...
   when: new Date(2191283823),
   ...
}
于 2014-08-01T22:59:59.137 に答える