Blog o trendech, pikantnostech a našem životě

JSON, Native JSON & Json.NET

09. června 2009 | Autor: Miroslav | komentáře

Na začátek trochu teorie. JSON (JavaScript Object Notition) je podmnožinou literálových výrazů JavaScriptu. A protože je podmnožinou JavaScriptu může v něm být použit jen tak beze všeho. JSON je formát pro výměnu dat (data exchange format) typicky mezi servervou aplikací a javascriptovou aplikací (tj. webovou stránkou).

JSON nebo XML

Oba formáty reprezentují objekty, uložené v paměti, v textové pro člověka čitelné formě a jsou vůči sobě isomorfní (tj. ekvivalentní texty lze mezi sebou převádět). Liší se především vhodností použití. XML je značkovací jazyk a kažký, kdo někdy dělal s webem přijde na nějaké použití XML (např. XHTML). Naproti tomu JSON má kořeny v datových typech a strukturách programovacích jazyků a tak poskytuje přirozenější a lépe použitelné mapování na strukturovaná data.

JSON a literály JavaScriptu

Jak už je napsáno výše JSON je podmnožinou literálových výrazů JavaScriptu, ale zatímco pravidla pro syntax literálů v JavaScriptu jsou volná a téměř cokoliv jimi lze vyjádřit, JSON je mnohem přísnější a jednoduší. Zpráva odpovídající JSON standardu se musí skládat z jediného objektu nebo pole na nejvyšší úrovni. Prvky pole nebo hodnoty objektu mohou být pole, objekty, řetězce, čísla, pravdivostní hodnoty nebo null. Jméno člena objektu musí být validní JSON řetězec a všechny řetězce musí být uzavřené do uvozovek (ne apostrofy). To je ve zkatce JSON standard (podrobněji www.json.org nebo RFC 4627). Naopak v JavaScriptu je prvkem pole/hodnotou objektu jakýkoli validní výraz včetně deklarací nebo volání funkcí. Více informací o literálových výrazech JavaScriptu naleznete snadno na webu.

var invalidJSON1 = { key : "retezcova hodnota" }; var invalidJSON2 = { 'key' : function() { return "value" } }; var validJSON = { "bindings": [ {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}, {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"}, {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"} ] }; 
Výrazy invalidJSON1/2 nejsou validní JSON, ale jsou validní z pohledu JavaScriptu.

De/serializace JSON objektů a řetězců

Pro převod textu v JSON formátu na objekt lze použít běžnou javascriptovou funkci eval(). Text musí být obalen závorkami pro vyhnutí se dvojznčnosti v JavaScript syntaxi.
var myObject = eval('(' + myJSONtext + ')'); 

Takovéto použití skýtá bezpečností riziko, protože eval() spustí scripty, které se mohou v myJSONtext potenciálně skrývat. Mnohem bezpečnější je použít JSON parser. Ten rozpozná JSON text a odmítne vše, co neodpovídá standardu. Navíc je v případě nativního JSONu mnohem rychlejší (k tomu později).

var myObject = JSON.parse(myJSONtext); 

Opačným směrem pracuje JSON stringifier, který převadí datové struktury na JSON text. Podobně jako XMLSerializer v .NET Frameworku nezvládá cyklické reference (jinými slovy poradí si pouze s acyklickými objektovými grafy).

var myJSONText = JSON.stringify(myObject); 

Native JSON

Nativní JSON je jednou z nových vlastností prohlížečů IE8 a Firefox 3.5 a měl by se stát součástí příští specifkace ECMAScriptu. V podstatě jde o zabudovanou de/serializaci JSON přímo v prohlížeči bez použítí JavaScriptu. Použití nativního JSON se nijak neliší od JSON parseru a strigifieru výše.
var jsonText = '{"name":"Me","address":"My House"}'; var myInfo = JSON.parse(jsonText); alert(myInfo.name); // Me var jsonText = JSON.stringify(person); // {"name":"Me","address":"My House"} 

Native JSON je postaven na json2.js scriptu a jeho zahrnutí zajistí podporu starších prohlížečů, zatímco ty s podporou Native JSON použijí svou interní implementaci.

Json.NET

Zatím jsme se zabývaly klientem, teď se podíváme na stranu serveru. Json.NET je open source framework pro práci s JSONem v prostředí .NET Framework. Domovské stránky projektu na Codeplexu a blogu JNK. Json.NET poskytuje třídy pro de/serializaci objektů do/z JSON řetězců.

Příklad z domovské stránky:

Product product = new Product(); product.Name = "Apple"; product.Expiry = new DateTime(2008, 12, 28); product.Price = 3.99M; product.Sizes = new string[] { "Small", "Medium", "Large" }; string json = JsonConvert.SerializeObject(product); //{ // "Name": "Apple", // "Expiry": new Date(1230422400000), // "Price": 3.99, // "Sizes": [ // "Small", // "Medium", // "Large" // ] //} Product deserializedProduct = JsonConvert.DeserializeObject Product(json); 

Navíc k přímé konverzi existují i další třídy, např. JsonReader a JsonWriter, a podpora LINQ to JSON.

string json = @"{ ""Name"": ""Apple"", ""Expiry"": new Date(1230422400000), ""Price"": 3.99, ""Sizes"": [ ""Small"", ""Medium"", ""Large"" ] }"; JObject o = JObject.Parse(json); string name = (string)o["Name"]; // Apple JArray sizes = (JArray)o["Sizes"]; string smallest = (string)sizes[0]; // Small 
Už z těch několika málo příkladů je vidět pěkná synergie mezi Native JSON a Json.NET a jejich vhodné a efektivní použití v AJAX aplikacích.
Poslední články Vyhledávání