【问题标题】:deserialize json string containing date反序列化包含日期的json字符串
【发布时间】:2012-05-15 05:29:31
【问题描述】:

我一直在看一些关于如何反序列化 json 字符串中的日期的帖子。

帖子提到对字符串进行替换以重新格式化日期部分。

json 字符串如下所示:

"/Date(1336258800000)/\"

显然我需要做的是:

"new Date(1336258800000)"

问题是当我尝试替换时,或者 indexOf ')/\' 找不到要替换的字符串(indexOf 为 -1)

谁能看到我做错了什么?

                    JavaScriptSerializer jss = new JavaScriptSerializer();

                    //Fix an issue with Json Dates
                    string json = eventArgument.Replace( @"/Date(", "new Date(" ).Replace( @")/\", ")" );

                    int index = json.IndexOf( @")/\", 0 );

                    WorkPattern wp = jss.DeserializeObject( json ) as WorkPattern;

这是完整的 json 字符串:

"{\"WorkPatternDays\":[{\"WorkPatternDayShifts\":[{\"WorkPatternDayShiftRates\":[{\"Duration\":8.5,\"Sequence\":0,\"WorkPatternDayShiftID\":186,\"WorkPatternDayShiftRateID\":105,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"}],\"WorkPatternDayShiftBreaks\":[{\"PaidBreak\":true,\"Duration\":1,\"EndTime\":\"/Date(1336050000000)/\",\"StartTime\":\"/Date(1336046400000)/\",\"WorkPatternDayShiftID\":186,\"WorkPatternDayShiftBreakID\":284,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"},{\"PaidBreak\":false,\"Duration\":0.25,\"EndTime\":\"/Date(1336058100000)/\",\"StartTime\":\"/Date(1336057200000)/\",\"WorkPatternDayShiftID\":186,\"WorkPatternDayShiftBreakID\":285,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"}],\"Duration\":8.5,\"EndTime\":\"/Date(1336062600000)/\",\"StartTime\":\"/Date(1336032000000)/\",\"WorkPatternDayID\":186,\"WorkPatternDayShiftID\":186,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"}],\"DayOfWeek\":1,\"DayOfWeekNumber\":1,\"WorkPatternID\":105,\"WorkPatternDayID\":186,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"},{\"WorkPatternDayShifts\":[{\"WorkPatternDayShiftRates\":[],\"WorkPatternDayShiftBreaks\":[{\"PaidBreak\":true,\"Duration\":0.5,\"EndTime\":\"/Date(1336041000000)/\",\"StartTime\":\"/Date(1336039200000)/\",\"WorkPatternDayShiftID\":187,\"WorkPatternDayShiftBreakID\":286,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"}],\"Duration\":5.5,\"EndTime\":\"/Date(1336046400000)/\",\"StartTime\":\"/Date(1336026600000)/\",\"WorkPatternDayID\":187,\"WorkPatternDayShiftID\":187,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"}],\"DayOfWeek\":3,\"DayOfWeekNumber\":3,\"WorkPatternID\":105,\"WorkPatternDayID\":187,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"}],\"WorkPatternName\":\"Naths Test Work Pattern\",\"WorkPatternID\":105,\"Deleted\":false,\"UpdatedUser\":\"\",\"UpdatedDate\":\"/Date(1336258800000)/\"}"

更多信息,看看它们是如何组合在一起的:

后面的代码:

        public override void DataBind()
        {
            try
            {
                if ( this.WorkPattern != null )
                {
                    //Create a javascript serializer
                    JavaScriptSerializer jss = new JavaScriptSerializer();

                    //Get the serialised object as a json string
                    string json = jss.Serialize( this.WorkPattern );

                    //Run the jquery code
                    base.RunjQueryCode(
                        String.Format( "loadWorkPattern({0});", json ) );

                    jss = null;
                }
            }
            catch ( Exception )
            {

                throw;
            }
        }

 protected override void HandlePostbacks( string eventTarget, string eventArgument )
        {
            try
            {
                switch ( eventTarget )
                {
                    case "Save":

                        JavaScriptSerializer jss = new JavaScriptSerializer();

                        //Fix an issue with Json Dates
                        string json = eventArgument.Replace( @"/Date(", "new Date(" ).Replace( @")/\", ")" );

                        int index = json.IndexOf( @")/\\", 0 );

                        WorkPattern wp = jss.DeserializeObject( json ) as WorkPattern;


                        object o = jss.Deserialize<WorkPattern>( json );


                        break;
                    default: break;
                }

                base.HandlePostbacks( eventTarget, eventArgument );
            }
            catch ( Exception )
            {
                throw;
            }
        }

标记/js:

function loadWorkPattern(jsonData) {

        //Store the work pattern
        _workPattern = jsonData;

        //Loop through the work pattern days
        $.each(_workPattern.WorkPatternDays, function (key, workPatternDay) {

            //Loop through each shift
            $.each(workPatternDay.WorkPatternDayShifts, function (key, workPatternShift) {
                addShift(workPatternShift, workPatternDay.DayOfWeekNumber);

                //Loop through each break
                $.each(workPatternShift.WorkPatternDayShiftBreaks, function (key, workPatternDayShiftBreak) {
                    addBreak(workPatternDayShiftBreak);
                });
            });
        });
    }

    function saveWorkPattern() {
        __doPostBack('Save', JSON.stringify(_workPattern));
    }

我调用 JSON.stringify 来序列化存储的对象,然后再发送回服务器,这是我做错了吗?

更新

这是工作代码:

string json = eventArgument.Replace( @"/Date(", "\\/Date(" ).Replace( @")/", ")\\/" );

【问题讨论】:

  • 你是发送到客户端还是发送到服务器? stackoverflow.com/questions/1224793/… 可能就是你所追求的
  • 对我有用的反序列化的正确格式:"\"\\/Date(1336302055941)\\/\""
  • @petrov.alex - 好的,明白了.. 这行得通:string json = eventArgument.Replace(@"/Date(", "\\/Date(").Replace(@") /", ")\\/" );
  • @petrov.alex - 你想用我的工作代码更新你的答案吗?

标签: c# json datetime deserialization


【解决方案1】:

试试int index = json.IndexOf( @")/\\", 0 ); - 在斜线前加一个斜线

更新

JavaScriptSerializer s = new JavaScriptSerializer();
string date = s.Serialize(DateTime.Now);
int index = date.IndexOf(@")\/", 0);
Console.WriteLine(index); // index = 21

更新 - 解决方案

问题是初始字符串是/Date(1336258800000)/,但不是/Date(1336258800000)/\,因为最后一个斜杠是JSON 中" 字符的转义。 并且去亚化的格式应该是不同的,所以可行的解决方案是

string json = eventArgument.Replace( @"/Date(", "\\/Date(" ).Replace( @")/", ")\\/" );

【讨论】:

  • 是的,尝试过 int index = json.IndexOf(@")/\\", 0 );仍然是-1。就像它无法解决 )/\,我尝试从 json 复制和粘贴代码,但查看它是否是隐藏字符但不起作用
  • 序列化的输出是"\/Date(1336300173708)\/"(斜线的顺序不同),那么这样就行了int index = date.IndexOf(@")\/")
  • 我已将传递给我的方法的json字符串添加到问题的底部,斜杠不是您指定的顺序??
  • 您是否使用 JsonSerializer 来获取 json?我什至不能只用你提供的破折号顺序初始化字符串(如果我没有使用序列化程序来获取字符串)
  • 嗨,我在问题中添加了更多信息,包括保存和加载的源。我使用 Javascript 序列化程序进行序列化,并通过调用 JSON.stringify 从 SaveWorkPattern() 方法中的 javascript 恢复 - 你认为这可能是问题吗?
【解决方案2】:

我使用了正则表达式,希望这不是问题。正则表达式检测到 /Date(NUMBER)/\ 并将 NUMBER 作为正则表达式匹配中的一个组,因此我使用它来替换 dateTimeJson 中与构造函数中指定的正则表达式匹配的所有内容,并使用 new Date(NUMBER)。

        //the source JSON
        string dateTimeJson = "/Date(1336258800000)/\\";
        string result = "";

        //you might want to do a quick IndexOf("Date") to make sure that there is a date
        //so you won't trouble yourselve with regex computation unnecessarily. performance?

        //find Date(NUMBER) matches and get the NUMBER then use it again with new Date in the 
        //call to replace
        System.Text.RegularExpressions.MatchCollection matches = null;
        System.Text.RegularExpressions.Regex regex = null;
        try
        {
            //at the end is one forwared slash for regex escaping \ and another is the \ that is escaped
            regex = new System.Text.RegularExpressions.Regex(@"/Date\(([0-9]*)\)/\\");
            matches = regex.Matches(dateTimeJson);
            string dateNumber = matches[0].Groups[1].Value;
            result = regex.Replace(dateTimeJson, "new Date(" + dateNumber + ")");
        }
        catch (Exception iii)
        {
            //MessageBox.Show(iii.ToString());
        }
        MessageBox.Show(result);

【讨论】:

  • 感谢 MZN - 我刚刚使用我在问题底部添加的代码。我想使用正则表达式,但现在可以使用,所以我不想碰它!
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
相关资源
最近更新 更多