jq选择嵌套键的子集

时间:2019-04-23 13:27:21

标签: json bash shell jq

我正在尝试在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": "..."
}

有什么主意吗?

2 个答案:

答案 0 :(得分:0)

除非我不明白您的要求,否则我认为不需要额外的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 }'    

除了对象名称是显式的以外,此脚本几乎相同。

答案 1 :(得分:0)

作为一种替代解决方案,您可以考虑使用步行路径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 $