Workflows supports maps (dictionaries) that can hold a user-defined structure of variables or lists.
For other map processing functions, see the Workflows standard
library map
module reference
.
Map definition
To define a map, add an assign step to the workflow:
YAML
- STEP_NAME_A : assign : - MAP_A : KEY_1 : VALUE_1 KEY_2 : KEY_3 : VALUE_2
JSON
[ { " STEP_NAME_A " : { "assign" : [ { " MAP_A " : { " KEY_1 " : " VALUE_1 " , " KEY_2 " : { " KEY_3 " : " VALUE_2 " } } } ] } } ]
For example:
YAML
JSON
If a key name includes non-alphanumeric characters (for example, the
exclamation point in "special!key": value
), you must wrap the key name in
quotes. For more information, in this document, see Access key names with non-alphanumeric characters
.
Similarly, when using dynamic keys in a map defined with braces, wrap the expression in quotes (single or double) so that it is YAML-compliant. For example:
YAML
- createMap : assign : - dynamicKey : "myKey" - myMap : { "${dynamicKey}" : "myValue" } - myMap2 : { '${dynamicKey + "Apple"}' : "myValue" }
JSON
[ { "createMap" : { "assign" : [ { "dynamicKey" : "myKey" }, { "myMap" : { "${dynamicKey}" : "myValue" } }, { "myMap2" : { "${dynamicKey + \"Apple\"}" : "myValue" } } ] } } ]
Read map values
To read the values in a map, use one of the following structures within an expression:
${ MAP . KEY } ${ MAP [ KEY_EXPRESSION ]}
Access nested keys
Use an additional period or index to access the value of a nested key.
For example, to return the value of Country
from the previous
example:
YAML
- lastStep : return : ${myMap.Address.Country}
JSON
[ { "lastStep" : { "return" : "${myMap.Address.Country}" } } ]
Access key names with non-alphanumeric characters
When accessing key names with non-alphanumeric characters (for example, the
exclamation point in "special!key": value
), you must wrap the key name in
quotes:
YAML
- createMap : assign : - var : key : "special!key" : bar - lastStep : return : '${"foo" + var.key["special!key"]}'
JSON
[ { "createMap" : { "assign" : [ { "var" : { "key" : { "special!key" : "bar" } } } ] } }, { "lastStep" : { "return" : "${\"foo\" + var.key[\"special!key\"]}" } } ]
Perform a safe lookup on a map
You can use the standard library function, map.get
, to perform a safe lookup
on a map, returning null
if the key is not found. For example:
YAML
- lastStep : return : ${default(map.get(myMap, "FirstName"), "Couldn't find key!")}
JSON
[ { "lastStep" : { "return" : "${default(map.get(myMap, \"FirstName\"), \"Couldn't find key!\")}" } } ]
For nested maps, a list of keys can be used to drill down into the map, using
a nested key lookup. For example, map.get(my2DMap, ["key1", "key2"])
is
equivalent to map.get(map.get(my2DMap, "key1"), "key2")
.
Insert and update map values
Use an assign
step to update existing keys, or to assign a value
to a new key.
Using index notation allows the use of expressions as the key. Note that the expression must evaluate to a string during execution.
YAML
- update_map : assign : - my_map : { "Key1" : "hello" } - key_str : "Key" - my_map.Key1 : "Value1" - my_map["Key2"] : "Value2" - my_map[key_str] : "Value3" - my_map[key_str + "4"] : "Value4"
JSON
[ { "update_map" : { "assign" : [ { "my_map" : { "Key1" : "hello" } }, { "key_str" : "Key" }, { "my_map.Key1" : "Value1" }, { "my_map[\"Key2\"]" : "Value2" }, { "my_map[key_str]" : "Value3" }, { "my_map[key_str + \"4\"]" : "Value4" } ] } } ]
You can create and update nested map values:
YAML
- update_nested_map : assign : - my_map : {} - my_map.NestedMapKey : { "Key1" : "Value1" } - my_map.NestedMapKey.Key2 : "Value2"
JSON
[ { "update_nested_map" : { "assign" : [ { "my_map" : {} }, { "my_map.NestedMapKey" : { "Key1" : "Value1" } }, { "my_map.NestedMapKey.Key2" : "Value2" } ] } } ]
You can update map keys dynamically in a for
loop:
YAML
- update_map_in_loop : assign : - keys : [ "key1" , "key2" ] - my_map : {} - for_loop : for : value : v index : i in : ${keys} steps : - loop_step : assign : - my_map[v] : ${i} - return_step : return : ${my_map}
JSON
[ { "update_map_in_loop" : { "assign" : [ { "keys" : [ "key1" , "key2" ] }, { "my_map" : {} } ] } }, { "for_loop" : { "for" : { "value" : "v" , "index" : "i" , "in" : "${keys}" , "steps" : [ { "loop_step" : { "assign" : [ { "my_map[v]" : "${i}" } ] } } ] } } }, { "return_step" : { "return" : "${my_map}" } } ]
The result of the preceding workflow should be {"key1":0,"key2":1}
.
Check existence of a key in a map
To check whether a given key is present in a map, use the following expression:
${ KEY
in MAP
}
For example:
YAML
- MyStep : switch : - condition : ${"Age" in myMap} next : AgeExists
JSON
[ { " MyStep " : { "switch" : [ { "condition" : "${\"Age\" in myMap}" , "next" : "AgeExists" } ] } } ]
To check whether a key is not in a map, use the not()
function:
YAML
- MyStep : switch : - condition : ${not("Age" in myMap)} next : AgeMissing
JSON
[ { " MyStep " : { "switch" : [ { "condition" : "${not(\"Age\" in myMap)}" , "next" : "AgeMissing" } ] } } ]
Get the length of a map
You can get the length of a map by using the len()
expression helper
.
This built-in function accepts an attribute of type map
and returns the
number of elements in the map as an integer. For example, the following sample
returns 2
:
YAML
- init : assign : - my_map : { "key1" : "hello" , "key2" : "world" } - returnStep : return : ${len(my_map)} # returns `2`
JSON
[ { "init" : { "assign" : [ { "my_map" : { "key1" : "hello" , "key2" : "world" } } ] } }, { "returnStep" : { "return" : "${len(my_map)}" } } ]

