Using Polymorphic Types with the JSON Protocol
The JSON protocol deals with managed objects whose properties include WSDL-defined data objects, such as configuration objects. Method parameters can also be data objects. Some of these data objects are polymorphic, in the sense that they can inherit from other data objects and can be referenced as the parent type.
The JSON protocol distinguishes the assigned type by adding a _typename
property to the JSON serialization. For example, a TaskInfo data object contains a
result
property that has the XSD type xsd:anyType
.
The actual type of the assigned value is specified with a _typename
property in result
.
_typeName
property."result": { "_typeName": "ManagedObjectReference", "_value": { "value": "domain-s16", "type": "ComputeResource" } }...
When you use a polymorphic type in a request,
you must add a _typename
property to identify the assigned type for the
server. For example, if you create a PropertyFilter
for a request to
the PropertyCollector, you might include a TraversalSpec
object, which
inherits from the SelectSet
object. Add the _typename
property to distinguish a TraversalSpec
value from a
SelectSet
value:
"traverse_vm_folder": { "_typeName": "TraversalSpec", "type": "Folder", "path": "childEntity", "skip": false }
Many properties are defined in the WSDL as
inheriting from DynamicData
. For that reason, you will use
_typeName
frequently. A best practice is to add the
_typeName
property to all objects you create for the JSON API.