преобразовать массив JSON в массив bash с сохранением пробелов - PullRequest
0 голосов
/ 09 июля 2020

Я хочу преобразовать JSON файл в bash массив строк, который я позже смогу перебирать. Моя структура JSON выглядит следующим образом:

[
  {
    "USERID": "TMCCP",
    "CREATED_DATE": "31/01/2020 17:52"
  },
  {
    "USERID": "TMCCP",
    "CREATED_DATE": "31/01/2020 17:52"
  }
]

А это мой bash скрипт:

test_cases=($(jq -c '.[]' data.json))
echo ${test_cases[0]}
echo ${test_cases[1]}
echo ${test_cases[2]}
echo ${test_cases[3]}

Как видите, он возвращает массив с 4 элементами вместо 2. Вывод:

{"USERID":"TMCCP","CREATED_DATE":"31/01/2020
17:52"}
{"USERID":"TMCCP","CREATED_DATE":"31/01/2020
17:52"}

По какой-то причине наличие пробела в поле даты вызывает некоторые проблемы с анализом. Есть идеи, как с этим справиться?

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Используйте вместо readarray.

$ readarray -t test_cases < <(jq -c '.[]' file)
$ declare -p test_cases
declare -a test_cases=([0]="{\"USERID\":\"TMCCP\",\"CREATED_DATE\":\"31/01/2020 17:52\"}" [1]="{\"USERID\":\"TMCCP\",\"CREATED_DATE\":\"31/01/2020 17:52\"}")

И read можно использовать, как показано ниже, где readarray недоступен.

IFS=$'\n' read -d '' -a test_cases < <(jq -c '.[]' file)
1 голос
/ 09 июля 2020

Используйте readarray для заполнения массива вместо использования подстановки команд без кавычек; bash не заботится о JSON цитировании, когда он разбивает результат на отдельные слова.

readarray -t test_cases < <(jq -c '.[]' data.json)

В bash 3.2 (это то, с чем вы, похоже, застряли), вам что-то нужно чуть более громоздкий

while IFS= read -r line; do
    test_cases+=("$line")
done < <(jq -c '.[]' data.json)
...