Конвертировать массив объектов json в ассоциативный массив bash - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть массив объектов json, которые я хотел бы преобразовать в ассоциативный массив в bash с небольшим изменением ключа

{
"Parameters": [
    {
        "Name": "/path/user_management/api_key",
        "Type": "SecureString",
        "Value": "1234",
        "Version": 1
    },
    {
        "Name": "/path/user_management/api_secret",
        "Type": "SecureString",
        "Value": "5678",
        "Version": 1
    }
]
}

Я знаю, что мне нужно использовать jq и sed, но я просто не могу найти правильное сочетание того, что я ищу. Нужно вычеркнуть "/ path / user_management /" и установить оставшееся в качестве ключа, и использовать Value для значения.

Попытка найти довольно чистые команды с одним трубопроводом. В итоге я хотел бы получить ассоциативный массив bash, например:

myArray[api_key]="1234"
myArray[api_secret]="5678"

1 Ответ

0 голосов
/ 05 сентября 2018

Запрашивать однострочный код так же хорошо, как запрашивать нечитаемый код. Если вы хотите сделать это надлежащим образом, прочитайте вывод команды jq в цикле while и удалите ненужные символы, как требуется.

#!/usr/bin/env bash

# declare an associative array, the -A defines the array of this type
declare -A _my_Array

# The output of jq is separated by '|' so that we have a valid delimiter
# to read our keys and values. The read command processes one line at a 
# time and puts the values in the variables 'key' and 'value'
while IFS='|' read -r key value; do
    # Strip out the text until the last occurrence of '/' 
    strippedKey="${key##*/}"
    # Putting the key/value pair in the array
    _my_Array["$strippedKey"]="$value"
done< <(jq -r '.Parameters[] | "\(.Name)|\(.Value)"' json)

# Print the array using the '-p' or do one by one
declare -p _my_Array

Или распечатать массив традиционным способом

for key in "${!_my_Array[@]}"; do 
    printf '%s %s\n' "${key}" "${_my_Array[$key]}"
done
...