Json format to represent soap

Revision as of 19:00, 10 March 2009 by CAH (talk | contribs)

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:


   <name username="fernandoflorez">Fernando</name>


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:


   <user name="fernando"/>
   <user name="frank"/>


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"/>


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"/>


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)

Jump to: navigation, search