Json datoer er sexede

by Jesper august 20, 2009 13:35

Hvorfor er det lige det skal være så besværligt at serialicerer og deserialicerer datoer i Json? Der har været flere forskellige tiltag, og måder til at håndterer datoer i de forskellige frameworks – mere eller mindre gode. Da jeg primært (99%) udvikler på Microsoft platformen, gør jeg det daglige arbejde lettere ved at adapterer det format, som de (MS) har valgt at understøtte. Hvordan er deres format så skruet sammen?

Jo de har valgt at serialicerer deres datoer, så de til dels er unikke/entydige, og dels er mindre besværlige at parse til et JavaScript dato-objekt. Strengen tager formen:

\/Date(1250753602336)\/

Det ser måske lidt kryptisk ud ved første øjekast, men er i grunden meget simpelt. Nummeret man ser, er faktisk det samme nummer man får i JavaScript, når man kalder getTime metoden på et dato objekt; altså antallet af millisekunder siden 1. januar 1970 00:00:00 i Greenwich mean time. Den mystiske tegnkombination: “\/” foran og bagefter, er udelukkende for at gøre udtrykket unikt / genkendeligt. Hvis man blot overholder dette format, vil en eventuel deserialicering med System.Web.Script.JavaScriptSerializer blive parset til et korekt DateTime objekt.

Hvis man nu vil deserialicerer datoen på klineten – altså i JavaScript?

Ja man kan f.eks. køre en simpel replace på strengen, og kalde eval:

dateString.replace(/\\\/Date(\d+)\\\//, "new Date($1)");

Det hele virker for mig ret kryptisk, men det virker, og så har man objekterne direkte ud af posen som f.eks. output fra en MVC controller.

Hvis du ønsker at Serialicerer et DateTime objekt manuelt i c# (guderne må vide hvorfor), kan du gøre det med følgende simple Extension:

public static string JsonSerialize(this DateTime date)
{
    var ms = (date - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
    return string.Format(@"\/Date({0:0})\/", ms);
}

Jeg lavede også et ekstra format, til mit JavaScript-core library, så jeg kan serialicerer datoer på klienten direkte på dato objektet. Udviddelsen er i Date.format prototypen:

Date.prototype.format = function(formatString) {
    if (m = formatString.match(/^j$/i))
       return "\\/Date({0})\\/".format(this.getTime());
};

// Brug:
new Date().format("{0:j}");    

Den fulde Core kode findes her.

Code On…

Tags:

JavaScript

Kommentarer

04-09-2009 08:36:07 #

trackback

Lille fix Json extension

Lille fix Json extension

ICoder

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  september 2010  >>
mationtofr
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

RecentComments

Comment RSS