2013-04-23 15 views
8

Po szeregowania obiektu z DateTime polu JavaScriptSerializer, widzę, że pole DateTime wygląda następująco:Jak przekonwertować JavascriptSerializer zserializowaną DateTime ciąg Javascript obiektu Date

EffectiveFrom: "/Date(1355496152000)/" 

jaki sposób można przekonwertować ten ciąg do JavaScript Date obiekt?

+2

To może pomóc Ci http: // codeasp.net/blogs/hajan/microsoft-net/1841/convert-net-serialized-json-datetime-to-javascript-date-object –

+0

możliwy duplikat [Formatowania daty Microsoft JSON?] (http://stackoverflow.com/ pytania/206384/format-a-microsoft-json-date) – Michael

Odpowiedz

7
var obj = { EffectiveFrom: "/Date(1355496152000)/" }; 

//parse the Date value and replace the property value with Date object: 

var dateValue = parseInt(obj.EffectiveFrom.replace(/\/Date\((\d+)\)\//g, "$1")); 
obj.EffectiveFrom = new Date(dateValue); 
16

UPDATE: Ta odpowiedź może nie być odpowiednia we wszystkich przypadkach. Zobacz dla eleganckiego rozwiązania, które prawdopodobnie jest lepsze.

Mogłeś po prostu "naprawić" wyjście z JavaScriptSerializer na stronie .NET rzeczy:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
var json = serializer.Serialize(this); 
json = Regex.Replace(json,@"\""\\/Date\((-?\d+)\)\\/\""","new Date($1)"); 
return json; 

Byłoby to zmienić

EffectiveFrom: "/Date(1355496152000)/" 

do

EffectiveFrom: new Date(1355496152000) 

który jest bezpośrednio eksploatowalny przez Javascript

EDIT: Aktualizacja pomieścić negatywne termin

EDIT: Tutaj jest linia Regex dla ludzi VB:

json = Regex.Replace(json, """\\/Date\((-?\d+)\)\\/""", "new Date($1)") 

UPDATE 20.11.2016: Z postępowania o wiele bardziej datetime w javascript/json za mną, sugerowałyby zmianę regex do czegoś tak prostego jak

json = Regex.Replace(json,@"\""\\/Date\((-?\d+)\)\\/\""","$1"); 

Uzyskana wartość jest ważna JSON i może być przekształcany do obiektu Date javascript na stronie.

Warto również zauważyć, że moment.js (http://momentjs.com/docs/#/parsing/) obsługuje ten format wystarczająco dobrze.

moment("/Date(1198908717056-0700)/"); 
+3

Dobry pomysł. Dlaczego JavaScriptSerializer używa formatu, który nie może być użyty przez JavaScript? – xr280xr

+1

Dwa powody. Po pierwsze, kiedy utworzono format JSON, pomijają literały daty. Po drugie, podczas gdy jest to "użyteczne bezpośrednio przez javascript", jest to użyteczne tylko w tym sensie, że musisz używać eval(), a eval() jest uważany za zły, ponieważ może być użyty w atakach typu cross-site scripting. – Zack

+2

json = Regex.Replace (json, @ "\" "\\/Date \ ((-? \ D +) \) \\/\" "", "new Date ($ 1)"); liczba może być ujemna –

6

Jest to bit hack, ale przede wydawało nieeleganckie za to, co staram się osiągnąć, więc w definicji obiektu Mam szeregowania, zrobiłem to:

 /// <summary>Date of the record retention event or document date. 
     /// </summary> 
     public string DateOfRetentionEvent; 
     [ScriptIgnore] 
     public DateTime RetentionEventDate 
     { 
      get 
      { 
       return _retentionEventDate; 
      } 
      set 
      { 
       _retentionEventDate = value; 
       DateOfRetentionEvent = value.ToShortDateString(); 
      } 
     } 

Chodzi o to, że przynajmniej w moim przypadku użycia (deserializacji nigdy nie dzieje się), JSON naprawdę nie obchodzi co robi C# z wartością daty. Dodanie wartości [ScriptIgnore] do wartości i podanie alternatywnego widoku dla parsera na wyjściu powinno załatwić sprawę. W moim przypadku:

{ 
    "DateToDispose": "1/1/2020", 
    "DateOfRetentionEvent": "10/1/2014", 
    "FullRetentionCode": "NR+5", 
    "RetentionEvent": "NR", 
    "RetentionPeriod": 5 
} 
Powiązane problemy