Bash

使用 jq 將 JSON 對象添加到數組

  • August 7, 2021

我的目標是使用bashjq中命令的輸出輸出 JSON 對象。find它可以是單行命令或 bash 腳本。

我有這個命令,它從每一行輸出創建 JSON 對象:

find ~/ -maxdepth 1 -name "D*" | \
while read line; \
do jq -n \
--arg name "$(basename "$line")" \
--arg path "$line" \
'{name: $name, path: $path}'; \
done

輸出如下所示:

{
 "name": "Desktop",
 "path": "/Users/username/Desktop"
}
{
 "name": "Documents",
 "path": "/Users/username/Documents"
}
{
 "name": "Downloads",
 "path": "/Users/username/Downloads"
}

但我需要將這些對象放在一個數組中,並且我需要該數組是父對象的單個鍵的值,稱為items,如下所示:

{"items": [
   {
     "name": "Desktop",
     "path": "/Users/username/Desktop"
   },
   {
     "name": "Documents",
     "path": "/Users/username/Documents"
   },
   {
     "name": "Downloads",
     "path": "/Users/username/Downloads"
   }
 ]
}

我嘗試將方括號添加到jq每行 ( ) 的輸出字元串中,'[{name: $name, path: $path}]';並添加方括號,但不添加數組元素之間的逗號。

我在這裡找到了可能的解決方案,但在遍歷每一行時我無法弄清楚如何使用它們。

流過濾器的這個技巧jq 1.5 inputs似乎可以做到

... | jq -n '.items |= [inputs]'

前任。

$ find ~/ -maxdepth 1 -name "D*" | 
   while read line; do 
     jq -n --arg name "$(basename "$line")" --arg path "$line" '{name: $name, path: $path}'
   done | jq -n '.items |= [inputs]'
{
 "items": [
   {
     "name": "Downloads",
     "path": "/home/steeldriver/Downloads"
   },
   {
     "name": "Desktop",
     "path": "/home/steeldriver/Desktop"
   },
   {
     "name": "Documents",
     "path": "/home/steeldriver/Documents"
   }
 ]
}

如果您不介意使用程式語言,這很簡單。這是一個使用 PHP 的範例:

<?php
$m1 = [
  'items' => []
];
$a1 = glob('~/D*');
foreach ($a1 as $s1) {
  $m1['items'][] = [
     'name' => basename($s1),
     'path' => $s1
  ];
}
echo json_encode($m1, JSON_PRETTY_PRINT);

引用自:https://unix.stackexchange.com/questions/569876