Json format to represent soap: Difference between revisions
(Adding Article Footer and Categories and adding headings for TOC) |
No edit summary |
||
Line 1: | Line 1: | ||
{{Unsupported}} | {{Archive}}{{Unsupported}} | ||
=Learn how to translate a soap request to JSON= | =Learn how to translate a soap request to JSON= |
Latest revision as of 13:21, 24 March 2015
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)