Skip to content

Instantly share code, notes, and snippets.

@sfaut
Created March 9, 2022 21:42
Show Gist options
  • Save sfaut/89a7511387ee555d6f601dd7368cd31e to your computer and use it in GitHub Desktop.
Save sfaut/89a7511387ee555d6f601dd7368cd31e to your computer and use it in GitHub Desktop.

[2022-03-09] Grabed from https://wiki.zimbra.com/wiki/Json_format_to_represent_soap

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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment