【问题标题】:C#/ASP.NET JSON date deserializeC#/ASP.NET JSON 日期反序列化
【发布时间】:2012-06-09 01:54:46
【问题描述】:

我正在尝试对以下代码中的对象进行反序列化,并且我想知道替换 json 日期的正确正则表达式是什么。当我运行以下代码时,正则表达式永远不会被触发。我在 json 字符串中使用标准的 JSON 日期格式。

{
    "UniqueId": "1000000003",     
    "Id": 3, 
    "ModifyTimestamp": "/Date(1338857699743)/"         
}

string json = // see above
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(convertJsonDateToDateString);
Regex reg = new Regex(p);
json = reg.Replace(json, matchEvaluator);
JavaScriptSerializer serializer = new JavaScriptSerializer();            
Student student = serializer.Deserialize<Student>(json) as Student; 



public static string convertJsonDateToDateString(Match m) {
        string result = string.Empty;
        DateTime dt = new DateTime(1970, 1, 1);
        dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
        dt = dt.ToLocalTime();
        result = dt.ToString("yyyy-MM-dd HH:mm:ss");
        return result;
    }

【问题讨论】:

    标签: c# asp.net json datetime deserialization


    【解决方案1】:

    这是一个完全可行的解决方案:

    using System;
    using System.Windows.Forms;
    using System.Text.RegularExpressions;
    
    namespace ResolveOverlapIssue
    {
        public partial class Form1 : Form
        {
            private static void DoSomethingElse<T>(ref T Id)
            {
                int i = 00;
            }
    
            public Form1()
            {
                InitializeComponent();
    
                string json = "{" +
                              "UniqueId: 1000000003," +
                              "Id: 3," +
                              "ModifyTimestamp: /Date(1338857699743)/" +
                              "}";
    
                MatchEvaluator matchEvaluator = ConvertJsonDateToDateString;
                var reg = new Regex(@".Date\(\d+\)\/.");
                json = reg.Replace(json, matchEvaluator);
    
            }
    
            public static string ConvertJsonDateToDateString(Match m)
            {
                var dt = new DateTime(1970, 1, 1);
                dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
                dt = dt.ToLocalTime();
                var result = dt.ToString("yyyy-MM-dd HH:mm:ss");
                return result;
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答...我实际上在对象中有大约 5 或 6 个日期,所以我不知道实际日期是什么。我可以在 中放入什么来让它将实际数字也作为正则表达式值?
    • 一旦您确定一切正常,请随时为我点赞,我需要积分 ;)
    • 你能在 pastebin 或其他地方粘贴一个工作(样本),以便我可以准确地看到你在做什么并尝试调试它吗?英国现在是 04:04,所以我很快就要睡觉了……但我可以先在附近闲逛并帮助你……
    • @AdamLevitt 哈哈哈,StackOverflow 似乎正在改变我写的东西...我检查了 pastebin,它就在那里:pastebin.com/jtTaJmSq 别忘了给我投票...这是值得的,比如潘婷...
    • @AdamLevitt 对。很抱歉弄乱了你,或者弄乱了你……这是一个完全有效的解决方案。我可以看到它在应该触发的时候触发了正确的方法,而在不应该触发的时候却没有触发。 pastebin.com/fhjSx6gD
    【解决方案2】:

    @"\\/Date 部分看起来不对。它可能应该是@"\/Date...""\\/Data..."。 (尾随 "...\\/" 相同)

    【讨论】:

    • 我不确定我是否遵循...这不是我已经拥有的吗? -- 字符串 p = @"\\/日期((\d+)\+\d+)\\/";
    • No.Vijay 的回答是正确的 - 在字符串前面没有对 ` as you get in case of using @` 进行双重转义:@"\\" 产生 2 个反斜杠,"\\" 只产生一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多