Maps
Similar to an Array field, a Map field may actually consist of several different values. RecordPath gives us the ability to select a set of values based on their keys. We do this by using a quoted String within square brackets. As an example, let's re-visit our original Record from above:
{ "name": "John Doe", "details": { "identifier": 100, "address": { "number": "123", "street": "5th Avenue", "city": "New York", "state": "NY", "zip": "10020" } } }
Now, though, let's consider that the Schema that is associated with the Record
indicates that the address
field is not a Record but rather a
Map
field. In this case, if we attempt to reference the
zip
using the RecordPath /details/address/zip
the
RecordPath will not match because the address
field is not a Record and
therefore does not have any Child Record named zip
. Instead, it is a
Map field with keys and values of type String. Unfortunately, when looking at JSON this
may seem a bit confusing because JSON does not truly have a Type system. When we convert
the JSON into a Record object in order to operate on the data, though, this distinction
can be important.
In the case laid out above, we can still access the zip
field using
RecordPath. We must now use the a slightly different syntax, though:
/details/address['zip']
. This is telling the RecordPath
that we want to access the details
field at the highest level. We then
want to access its address
field. Since the address
field is a Map
field we can use square brackets to indicate that we
want to specify a Map Key, and we can then specify the key in quotes.
Further, we can select more than one Map Key, using a comma-separated list:
/details/address['city', 'state',
'zip']
. We can also select all of the fields, if we want, using the
Wildcard operator ():
/details/address[]
. Map fields do not contain any sort of
ordering, so it is not possible to reference the keys by numeric indices.