2012-05-06 2 views
0

Я смотрел несколько сообщений на SO о том, как десериализовать дату в строке json.deserialize json string, содержащая дату

В сообщениях упоминается замена на строку для форматирования частей даты.

строка JSON выглядит следующим образом:

"/Date(1336258800000)/\" 

, по-видимому, что мне нужно, чтобы добраться до это:

"new Date(1336258800000)" 

Беда в том, как только я пытаюсь и к замене или IndexOf ')/\' он не находит заменяемую строку (indexOf is -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)); 
    } 

Im вызывает JSON.stringify для сериализации сериализованного хранимого объекта перед отправкой обратно на сервер, это то, что я делаю неправильно?

UPDATE

Это рабочий код:

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

Вы отправляете его клиенту или на сервер? Http: // StackOverflow.com/questions/1224793/javascript-serialization-of-datetime-in-asp-net-is-not-giving-a-javascript-date/1227767 # 1227767 может быть то, что после –

+1

правильный формат десериализации, который работал для меня: '" \ "\\/Date (1336302055941) \\/\" "' –

+0

@ petrov.alex - ОК, получил это .. это работает: строка json = eventArgument.Replace (@ "/ Date (", "\\/Date (") .Replace (@ ") /", ") \\ /"); – WraithNath

ответ

1

Попробуйте int index = json.IndexOf(@")/\\", 0); - поставить другую косую черту перед косой чертой

Update

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

Update - решение

Проблема заключается в начальной строке /Date(1336258800000)/, но не /Date(1336258800000)/\ как последний слэш побег из " характера в формате JSON. А формат для desiarization должен быть dirrerent, поэтому рабочий раствор

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

просто попробовал это, и результат все еще -1 :( – WraithNath

+0

да попытался int index = json.IndexOf (@ ")/\\", 0); и все еще -1. Это как-то не работает)/\, я пробовал копировать и вставлять код из json, но чтобы убедиться, что это скрытый символ, но не работает. – WraithNath

+0

Результат сериализации - '\ \ Date (1336300173708) \/"' (порядок косой черты отличается), так что это работает 'int index = date.IndexOf (@") \/")' –

1

Я использовал регулярные выражения, надеюсь, что это не проблема. Регулярное выражение обнаруживает /Date(NUMBER)/\ и получает NUMBER как группу в регулярном выражении, поэтому я использую это для замены всего в dateTimeJson, который соответствует регулярному выражению, указанному в его конструкторе, с новой 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); 
+0

Спасибо MZN - я только что получил ее работу с кодом, который я добавил в нижней части моего вопроса. Я хотел использовать регулярное выражение но теперь он работает, поэтому я не хочу трогать его! – WraithNath