I have the following code which reads all the fields
of a Json file (the path being PRIVATE_REGISTRATION_FILE
and stores them into an associative array (PRIVATE_FIELDS
) which I query later in my code:
declare -A PRIVATE_FIELDS
for PRICING_FIELD in $(jq -c -r '.fields[]' "${PRIVATE_REGISTRATION_FILE}")
do
FIELD_KEY=$(jq -r '.label' <<< "${PRICING_FIELD}")
PRIVATE_FIELDS["${FIELD_KEY}"]=${PRICING_FIELD}
done
The problem is that I do this several times with several files, even though the logic is always the same.
Hence, I was thinking to extract this logic into a function but I'm having a hard time passing the map parameter to it.
This is what I attempted:
function update_array
{
FILE_NAME=$1
eval "declare -A MAP="${2#*=}
for PRICING_FIELD in $(jq -c -r '.fields[]' "${FILE_NAME}")
do
FIELD_KEY=$(jq -r '.label' <<< "${PRICING_FIELD}")
MAP["${FIELD_KEY}"]=${PRICING_FIELD}
done
}
Which I call like this:
declare -A PRIVATE_FIELDS
update_array "myFile.json" "$(declare -p PRIVATE_FIELDS)"
However it doesn't work, the map remains empty.
echo ${PRIVATE_FIELDS["someKey"]}
>>> (empty)
I have tried literally each solution proposed in this answer but none of them worked. What am I doing wrong?
Bash version: 4.2.46(2)-release
Additional note, the Json file looks like this (apparently the calls to jq
may be reduced):
{
"name": "Something",
"fields": [
{
"label": "key1",
"value": "value1",
"other": "other1"
},
{
"label": "key2",
"value": "value2",
"other": "other2"
}
]
}