Converting JSON to XAML
For reasons beyond human comprehension, the world felt like making an huge deal about Microsoft "revealing" SilverLight even even though WPF/E has been known about for some time now and even though nothing technical has changed even in the slightest with the simple change of a name. Having said that... it will probably be an awesome technology and I'm sure I'll be marinating many of my future applications in it. Editing XAML in notepad is much more appealing to me than being forced to use the overpriced and overly complicated Flash.
As cool as that is, however, since most of the work I do involves pure Ajax/JavaScript clients with almost all .NET coding at the service level, I definitely find JSON (which IS a JavaScript object) easier to manage than XML (which CAN BE a JavaScript object). So, in one of my applications I have the service that provides graphical information to Silverlight in the form of JSON serialized XAML, which will then be converted into XAML.
Here is an example of something the service would provide:
var jsonElement1 = { 'Ellipse': { 'Canvas.Left': '130', 'Canvas.Top': '130', Height: '200', Width: '200', Stroke: 'Red', StrokeThickness: '10', Fill: 'SlateBlue' } };
No, it's not human readable like XML is, but it's what JavaScript loves to see and it's what my service creates. Also, no, this is done for for efficiently purposes. This doesn't lower the service "message" size in the slightest, but it does however help to keep a consistence programming model across all my service calls. Furthermore, given that the data was in a database and not in XAML on the server, there's no real overhead. If, however, the data was in XAML on the server it would be a sign of pure stupidity for me to convert that to JSON and then back to XAML.
The parsing for something like this is actually really simple: just iterate through the JSON objects and arrays and creating an XML tree from it. As a reminder or reference, with regard to XML in a web browser, Firefox uses document.implementation.createDocument for XML while IE uses the MSXML2.DOMDocument COM object. Furthermore, Firefox is more strict in its usage of XML than the more familiar COM model that IE uses.
Here is an example of what I mean:
var doc = null; if(DOM.implementation && DOM.implementation.createDocument) { doc = DOM.implementation.createDocument('', '', null); Xaml.ScanJSONElements(doc, data, doc); var xmlSerializer = new XMLSerializer( ); return xmlSerializer.serializeToString(doc); } else { doc = new ActiveXObject("MSXML2.DOMDocument"); Xaml.ScanJSONElements(doc, data, doc); return doc.xml; }
As you look through the Xaml.js file provided, you will also see that Firefox is very explicit about it's namespaces, while the COM model figured you will take care of them. There's nothing wrong with either approach, it's just something you will want to be aware of if you ever create XML in JavaScript.
Links