簡體   English   中英

jq 選擇嵌套鍵的子集

[英]jq select subset of nested keys

我正在嘗試在 jq 之上為 json 文件構建一個 SQL 層,我想實現選擇。 到目前為止,我得到了:

 function join() {
     # If no arguments, do nothing.
     # This avoids confusing errors in some shells.
     if [ $# -eq 0 ]; then
         return
     fi

     local joiner="$1"
     shift

     while [ $# -gt 1 ]; do
         printf "%s%s" "$1" "$joiner"
         shift
     done

     printf '%s\n' "$1"
 }

 function jselect {
     keys=`join "\":1, \"" $@`
     jq "with_entries(select(.key | in({\"$keys\":1})))"
 }

允許我做

$ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jselect success results

>>> {
  "success": true,
  "results": {
    "a": "...",
    "b": "...",
    "c": "..."
  }
}

但我希望能夠索引嵌套屬性以及類似的內容:

$ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jselect success results

>>> {
  "success": true,
  "results": {
    "b": "..."
  }
}

or

>>> {
  "success": true,
  "results.b": "..."
}

任何的想法?

除非我不明白您的要求,否則我認為不需要多余的shell腳本,您可以使用簡單的jq腳本:

echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jq '{ success, results }'

jq腳本僅選擇所需的2個對象。 請注意,每個對象使用1個關鍵字的簡短形式(而不是"success":.success )。

echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jq '{ success, "results.b":.results.b }'    

除了對象名稱是顯式的,此腳本幾乎相同。

作為一種替代解決方案,您可以考慮使用步行路徑unix工具jtc來處理JSON-使用jtc可以通過多種方式來實現您的要求,但最巧妙的方法是僅將那些走過的條目留在JSON中(並清除所有內容)其他):

bash $ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jtc -w[success] -w[results][b] -pp
{
   "results": {
      "b": "..."
   },
   "success": true
}
bash $ 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM