JSON_SET_VALUE
Use the JSON_SET_VALUE script function to set the value of an existing element in a JSON document.
Syntax
JSON_SET_VALUE (JSON,JSONPath,Value[,Cast])
Parameters
| Parameter | Description | Format | Allowed Values |
|---|---|---|---|
| JSON | A string that is interpreted as a JSON document. | String | n.a. |
| JSONPath | The JSONPath that identifies the element that need updating. | String | n.a. |
| Value | The value that should be assigned to the JSON element. | n.a. | n.a. |
| Cast |
(Optional) This parameter controls the conversion from Automic Script to JSON datatypes. |
String |
|
Casting Examples
The following section explains casting using practical examples. Consider the following script:
:SET &JSON_DOC# = '{"val":""}'
:SET &RET# = JSON_SET_VALUE(&JSON_DOC#, '$.val',&VALUE#,&CAST#)
The following table summarizes the changes in &JSON_DOC# after the ADD_ITEM call given different &ITEM# and &CAST# values:
| &VALUE# | &CAST# | &JSON_DOC# after ADD_ITEM |
|---|---|---|
| '[1,2,3]' | AUTO | {"val":[1,2,3]} |
| '[1,2,3]' | STRING | {"val":"[1,2,3]"} |
| '1' | AUTO | {"val":1} |
| '1' | STRING | {"val":"1"} |
| '1' | NUMBER | {"val":1} |
| '1' | BOOLEAN | {"val":true} |
| 'twelve' | AUTO | {"val":"twelve"} |
| 'twelve' | NUMBER | {"val":""} (remark: invalid casting - JSON document is not modified and a casting error is returned) |
Important Considerations
Keep the following rules, limitations, and tips in mind when using this script function:
- Always test JSONPath expressions in an Automation Engine script before you put them into production. JSONPath expressions developed in other tools may not work as there is no common JSONPath standard.
- JSON_SET_VALUE does not allow you to add new items to objects or arrays. Use JSON_ADD_ITEM for this purpose.
- PATH_TO_ELEMENT can only target one JSON element that should be set. The path must exist in the document.
- JSON documents larger than 1MB are not supported.
Tip: Sometimes you need to quote (escape) parts of your JSON documents because they are processed by a separate entity. You can achieve escaped parts by using the cast type string for the quoted JSON sub-document.
Return Value
None / Error Code in case of error.
Runtime Errors
JSON_SET_VALUE will fail with a runtime error on the following conditions:
- 45334: If your JSON document is invalid.
- 45342: Syntax Error in JSONPath expression.
- 45337: Invalid Cast-Parameter: AUTO, STRING, NUMBER, BOOLEAN, or JSON expected.
- 45338: Cannot cast value into chosen data type.
- 45340: JSONPath does not match any element.
Examples
This example uses the script function to enrich a JSON object with new values:
:SET &JSON_DOC#='{"OS": "Linux","disks": null, "isAvailable": false, "inventoryNumber":123}'
:SET &IS_AVAIL#=1
:SET &RET# = JSON_SET_VALUE(&JSON_DOC#,'$.disks','[{"GB":2000, "type":"HDD"},{"GB":512, "type":"SSD"}]','JSON')
:SET &RET# = JSON_SET_VALUE(&JSON_DOC#,'$.isAvailable',&IS_AVAIL#,'BOOLEAN')
:SET &RET# = JSON_SET_VALUE(&JSON_DOC#,'$.inventoryNumber','null')
:P &JSON_DOC#
Activation report result:
U00020408 {"OS":"Linux","disks":[{"GB":2000,"type":"HDD"},{"GB":512,"type":"SSD"}],"isAvailable":true,"inventoryNumber":null}
The following example escapes quoted JSON sub-documents:
:SET &DOC# = '{"deploymentName": "hugeServer", "ansibleConf":""}'
:SET "ED_SUBDOC# = '{"awsZone":"srvaws02"}'
:SET &RESULT# = JSON_SET_VALUE(&DOC#, '$.ansibleConf', "ED_SUBDOC#, 'STRING')
:P &DOC#
!outputs {"deploymentName":"hugeServer","ansibleConf":"{\"awsZone\":\"srvaws02\"}"}
See also:
seealso