JSON-to-XML - harder stuff
i continue to beat up my JSON-to-XML service today. as i mentioned in my previous post, i'm building this service so that i can consistently convert incoming JSON strings (from PUT/POST into a valid XML document. that's because my exyus engine uses XML documents to validate (via XSD) and transform (via XSLT) data into whatever representation(s) i need. so this is all about utility and consistency.
anyway, here's a couple other examples of output from my utility. first, a JSON string that contains and array *and* at least one name that is an invalid XML name (due to use of namespace):
{'tasks' :
{ 'xml:base':'http://localhost/xcs/tasklist/',
'task' : [
{'id' : 'x8ca2f68ed5464b2', 'seq' : '1', 'name' : 'Read Mike\'s TaskList Tutorial', 'is-completed' : '1'}
,
{'id' : 'x8ca2f68f058de9a', 'seq' : '2', 'name' : 'Download Exyus', 'is-completed' : '0'}
,
{'id' : 'x8ca2f68f623d546', 'seq' : '3', 'name' : 'Install and run examples', 'is-completed' : '0'}
,
{'id' : 'x8ca2f690144ef64', 'seq' : '4', 'name' : 'Use Exyus to build my own cool app', 'is-completed' : '0'}
]
}
}
<root>
<tasks>
<task>
<item>
<is-completed>1</is-completed>
<name>Read Mike's TaskList Tutorial</name>
<seq>1</seq>
<id>x8ca2f68ed5464b2</id>
</item>
<item>
<is-completed>0</is-completed>
<name>Download Exyus</name>
<seq>2</seq>
<id>x8ca2f68f058de9a</id>
</item>
<item>
<is-completed>0</is-completed>
<name>Install and run examples</name>
<seq>3</seq>
<id>x8ca2f68f623d546</id>
</item>
<item>
<is-completed>0</is-completed>
<name>Use Exyus to build my own cool app</name>
<seq>4</seq>
<id>x8ca2f690144ef64</id>
</item>
</task>
<xml_base>http://localhost/xcs/tasklist/</xml_base>
</tasks>
</root>
not bad. notice the use of the item elements for each member of an array. this is a bit of 'cruft', but it makes logical sense and eases the recursion work i need to do to interpret the JSON string. also note that the incoming "xml:base" has been converted to "xml_base". technically, this is not an invalid XML element name, but i have way to easily sort out XML namespaces in JSON strings[!] so i just convert it.
ok, now how about something a bit more challenging. this is an extensive example i found while researching the rules for JSON serialization. check this out:
{
"this test" : true,
"ThreeDSort" : {
z : 9.323
},
"x y" : "x y",
yPos : {
"inner" : [2,4],
"outer" : [4,8,4,8]
},
"props": [ true, null, false],
"oldVals": [ "oldvals1", {innermost:"old+inner"}, "oldvals3"],
y1 : {
z : "value"
},
"xy and z": "xy and z",
y3 : {
z2 : "z2"
}
};
<root>
<xy_x0020_and_x0020_z>xy and z</xy_x0020_and_x0020_z>
<ThreeDSort>
<z>9.323</z>
</ThreeDSort>
<props>
<item>True</item>
<item>null</item>
<item>False</item>
</props>
<x_x0020_y>x y</x_x0020_y>
<oldVals>
<item>oldvals1</item>
<item>
<innermost>old+inner</innermost>
</item>
<item>oldvals3</item>
</oldVals>
<this_x0020_test>true</this_x0020_test>
<y3>
<z2>z2</z2>
</y3>
<yPos>
<outer>
<item>4</item>
<item>8</item>
<item>4</item>
<item>8</item>
</outer>
<inner>
<item>2</item>
<item>4</item>
</inner>
</yPos>
<y1>
<z>'f'f''</z>
</y1>
</root>
wow! lots going on there. note the conversion of invalid XML names using the standard XML method of 'escaping' the invalid characters w/ unicode hex. not pretty but standard and safe. lots of nesting; several arrays, etc. mind you, this is 'scary' XML, but it's valid. that's my goal.
i am finishing up the testing and code clean up today. i'll post the bits into the exyus googlecode this weekend. and i should have support for incoming JSON before the start of next week.