我正在尝试在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": "..."
}
有什么主意吗?
答案 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 $