JSONSelector
Specify which record member needs to be serialized or deserialized.
Syntax
JSONSelector
is a mandatory attribute used with JSONOneOf.
Usage
In an operation that you set JSONOneOf
to specify members of a record or a
user-defined type that need to be serialized or
deserialized, you must set the JSONSelector
on a specific member of the record to
perform the selection. This specific member must be of type SMALLINT or INTEGER.
The JSONSelector
attribute supports the oneOf
keyword in the
JSON schema property of the Swagger and OpenAPI specifiaction.
Example using JSONSelector and JSONOneOf
In this example, the JSONSelector
attribute is set on the
_selector
member in the input record of the CreateAccount
function. At a request to the
service, you can choose which member of the createAccountType
record –
id
or name
– to use by setting the member of the input record with
the JSONSelector
attribute, _selector
in our example, to the index value of the record member.
For example, in a request from your client application, you
might have a statement like this: LET in._SELECTOR=2
.
In the CreateAccount
function, the CASE
statement tests for the _selector
value.
IMPORT COM
PUBLIC TYPE accountType RECORD
id INTEGER,
name STRING,
date DATETIME YEAR TO SECOND,
age INTEGER,
gender BOOLEAN
END RECORD
PRIVATE DEFINE accounts DYNAMIC ARRAY OF accountType
PUBLIC DEFINE accountError RECORD ATTRIBUTE(WSError = 'account service error')
id INTEGER,
msg STRING
END RECORD
TYPE createAccountType RECORD ATTRIBUTE(JSONOneOf)
_selector INTEGER ATTRIBUTE(JSONSelector),
id INTEGER,
name STRING
END RECORD
FUNCTION CreateAccount(
in createAccountType)
ATTRIBUTE(WSPost, WSPath = "/createaccount")
RETURNS(createAccountType)
DEFINE out createAccountType
DEFINE idx INTEGER
LET out = in
CASE
WHEN in._selector = 1
LET idx = accounts.search("id", in.id)
IF idx > 0 THEN
# raise RESTError with accountError
ELSE
CALL accounts.appendElement()
LET accounts[accounts.getLength()].id = in.id
END IF
WHEN in._selector = 2
LET idx = accounts.search("name", in.name)
# ... function code ...
END CASE
RETURN out
END FUNCTION