JSON Extension

by Jesper februar 19, 2008 16:00

Jeg har i gennem længere tid rodet rundt med jQuery, som er et, efter min mening, ret cool javascript library, til cross-browser klient side programmering. Check det selv ud. En af de smarte features i jQuery, er måden hvorpå XmlHttpRequests er abstraheret. Man får her bl.a. mulighed for at behandle en respons som JSON. Jeg kan selv godt lide Xml, og var i starten ret skeptisk på JSON – hvorfor opfinde en ny standard der baserer sig på Javascript, når vi nu har en velfungerende Xml DOM? Jo, fordi det er meget lettere. Man er jo helt fri for at traverserer sit dokument op og ned via Xml-API'et – man kan bare referere til objektet med det samme. Det er da smart.

Nu har jeg jo et rimeligt omfattende MVP framework, som stort set returnerer Xml fra alle Action's der har en returværdi. Hvordan får man lige det til at håndterer JSON requests?

Min første tanke var at lave en Ekstension til Object objektet, og bare kalde en ny ToJson() metode, lige som jeg gør, når jeg kalder ToString, når jeg skal bruge en streng repræsentation af objektet. Denne ekstension, skal så bare reflekterer over objektets egenskaber, og så kan jeg hekse lidt med strenge o.s.v. Omfattende men lige til. Jeg er altid lidt doven, når en sådan lige til opgave ligger der, og vil ligge beslag på min tid med triviel kodning. Derfor googlede jeg lidt på 'ToJson', og lur mig om Scott Guthrie ikke havde en blog-post med lige netop det emne, og hans MVP framework har endda en JavaScriptSerializer – fedt. Bare lige til at bruge. Men hvad var nu det? Den er markeret som Obsolete, og det anbefales at man bruger System.Runtime.Serialization.DataContractJsonSerializer'en i stedet. Hvorfor den ikke bliver brugt i SG's framework er jo underligt – måske han overså den i første omgang J

For lige at forklare hvordan jeg implementerede denne løsning, tager jeg udgangspunkt i et simpelt objekt – mit Person-objekt:

[code=csharp;Person objektet] namespace Json { public class Person { public string Name { get; set; } public DateTime DayOfBirth { get; set; } public string[] FavoritPhrases { get; set; } } }[/code]

Det er den slags objekter som mine actions, returnerer til klienten, og som jeg bruger til at generere en rigere bruger oplevelse. Jeg kunne selvfølgelig lave ToJson metoden på selve objektet, men nu har vi jo fået den nye feature: Extension-method i .NET framework 3.5, så hvorfor ikke bare bruge den? Jeg laver en statisk klasse med den ene metode. Selve metoden er ret simpelt implementeret med den indbyggede Serializer:

[code=csharp;ToJson Extension metode]namespace Json { public static class JsonExtension { public static string ToJson(this object obj) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); using (MemoryStream stream = new MemoryStream()) { serializer.WriteObject(stream, obj); return ASCIIEncoding.UTF8.GetString(stream.ToArray()); } } } }[/code]

Det eneste man så skal huske, er at markerer sin klasse med DataContract-attributten, og de medlemmer der skal serialiseres med DataMember-attributten – that's it. Sådan laver man en JSON response J

[code=csharp]namespace Json { [DataContract] public class Person { [DataMember] public string Name { get; set; } [DataMember] public DateTime DayOfBirth { get; set; } [DataMember] public string[] FavoritPhrases { get; set; } } }[/code]

Nåh ja – og resultatet:

O non codin..

Tags:

Kommentarer

15-07-2009 14:48:53 #

pingback

Pingback from icoder.dk

ICoder | Opdatering af UI via Extension Method

icoder.dk

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