0

问:如何让 Json.NET 成功将此 json 日期结构转换为 C# DateTime?

您好,我正在尝试使用 DDP 协议将现有 Meteor.js 应用程序上的方法调用的返回值反序列化为已知/严格的返回结构。

我正在使用动态来实现最基本的东西,但是,转向严格的结构以从 C# 方面的类型安全和智能感知中受益。

但是,它无法使用 javascripts Date() 的 ddp 序列化结构将 Javascripts Date() 成功反序列化为 C#s DateTime:

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

问:如何让 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 回答