Добавьте больше полей в json файл, используя JQ - PullRequest
1 голос
/ 10 апреля 2020

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

Я попробовал этот код:

 echo '{"Name": "FileName", "Size": "FileSize", "Action": "Action taken"}' | jq file.json

Но это не удалось:

jq: ошибка: очистить / 0 не определено в строке 1: очистить. json jq: 1 ошибка компиляции

 [
   // Data should goes here
 ]

Ожидаемый результат:

 [
      {
       "Name": "FileName",
       "Size": "FileSize",
       "Action": "Action taken",
      },

      // and so on
 ]

Заранее спасибо

1 Ответ

1 голос
/ 10 апреля 2020

У меня проблемы с пониманием деталей вашего вопроса, но похоже, что у вас есть:

  • A JSON строка, представляющая объект, например, '{"foo": "bar"}'
  • Файл JSON, который содержит либо
    • Ничего (файл пуст и поэтому недействителен JSON)
    • массив JSON, например [{"a": "b"}, {"c": "d"}]

И вы хотите добавить объект JSON к существующему массиву или, если файл пуст, создать новый массив с объектом в качестве собственного элемента.

Самый простой способ сделать это - сначала убедиться, что файл содержит действительный JSON, записав пустой массив, если он пуст, а затем безоговорочно добавить в этот список:

file='myfile.json'
object='{"Name": "FileName", "Size": "FileSize", "Action": "Action taken"}'

# Check if file is empty
if ! [ -s "$file" ]
then
  # It is. Write an empty array to it
  echo '[]' > "$file"
fi

# Read from the file, append the object, write to a temporary file
jq --argjson x "$object" '. += [$x]' < "$file" > tmp.json

# Overwrite the original file with the temporary one
mv tmp.json "$file"

Если вы начинаете с пустого файл (или нет файла), после успешного запуска файл будет содержать это:

[
  {
    "Name": "FileName",
    "Size": "FileSize",
    "Action": "Action taken"
  }
]

Если вы запустите его еще раз, он будет содержать это:

[
  {
    "Name": "FileName",
    "Size": "FileSize",
    "Action": "Action taken"
  },
  {
    "Name": "FileName",
    "Size": "FileSize",
    "Action": "Action taken"
  }
]
...