Json format to represent soap: Difference between revisions
(How to translate xml soap calls to JSON and visceversa) |
mNo edit summary |
||
Line 1: | Line 1: | ||
{{Unsupported}} | |||
'''Learn how to translate a soap request to JSON''' | '''Learn how to translate a soap request to JSON''' | ||
Revision as of 19:00, 10 March 2009
Learn how to translate a soap request to JSON
Zimbra has a special way to represent soap xml in JSON.
Here is the documentation of how i've learned it works.
Example #1:
<root>
<name username="fernandoflorez">Fernando</name>
</root>
Translating it to json:
JSON structures always start being an object:
{}
Nodes of type 3 (element nodes) are objects:
{root: {}} -> <root />
{root: {name: {}}} -> <root><name /></root>
Object properties are changed to node attributes if they are of a type Number or String:
{root: {name: {username: "fernandoflorez"}}} -> <root><name username="fernandoflorez" /></root>
Nodes of type 1 (text nodes) are represented by the reserved "_content" parameter name:
{root: {name: {username: "fernando", _content: "Fernando"}}}
That's it for Example #1.
Example #2:
<users>
<user name="fernando"/> <user name="frank"/>
</users>
If an element node has different siblings of the same node name then the object is translated into an array of object:
{users: {user: [{name: "fernando"}, {name: "frank"}]}}
Example #3:
<users xmlns="urn:namespace">
<user name="fernando"/> <user name="frank"/>
</users>
Node namespaces are also represented by a reserved parameter name: "_jsns"
{users: {_jsns: "urn:namespace", user: [{name: "fernando"}, {name: "frank"}]}}
Just if you wonder, why all reserved parameter names start with an underscore character? Thats because underscores at the beginning of the word are not xml valid names so it's a way to avoid name conflicts.
Suggestions for improvement:
There is no way to reconvert from json to xml and mantain the same data structure order. For example if we translate this json:
{users: {_jsns: "urn:namespace", user: [{name: "fernando"}, {name: "frank"}]}}
There is no way to be 100% sure it will be converted to this because of how loops in ECMA script are performed.
<users xmlns="urn:namespace">
<user name="fernando"/> <user name="frank"/>
</users>
A solution for this would be to have an optional reserved parameter name "_o" that will have a zero index based value (int).
--Fernandoflorez 19:07, 22 February 2009 (UTC)