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)

Jump to: navigation, search