[2022-03-09] Grabed from https://wiki.zimbra.com/wiki/Json_format_to_represent_soap
Zimbra has a special way to represent soap xml in JSON.
Here is the documentation of how i've learned it works.
<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.
<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" }] }}
<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.
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)