【发布时间】:2017-11-18 21:30:41
【问题描述】:
我有一个包含以下内容的 JSON:
{
"data": [
{
"name": "Test",
"program": {
"publicAccess": "--------",
"externalAccess": false,
"userGroupAccesses": [
{
"access": "r-------"
},
{
"access": "rw------"
}
],
"id": "MmBqeMLIC2r"
},
"publicAccess": "rw------"
}
]
}
我想删除所有匹配 publicAccess 或 userGroupAccesses 的键(递归),这样我的 JSON 看起来像这样:
{
"data": [
{
"name": "Test",
"program": {
"externalAccess": false,
"id": "MmBqeMLIC2r"
}
}
]
}
我从source 复制了jq 的内置walk 函数。
# Apply f to composite entities recursively, and to atoms
def walk(f):
. as $in
| if type == "object" then
reduce keys[] as $key
( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f
elif type == "array" then map( walk(f) ) | f
else f
end;
# My Code
walk(if (type == "object" and .publicAccess)
then del(.publicAccess)
elif (type == "array" and .userGroupAccesses)
then del(.userGroupAccesses)
else
.
end )
给我jq: error (at <stdin>:2622): Cannot index array with string "userGroupAccesses"。另外,如果我使用.userGroupAccesses[] - 我如何获得结果?
jqplay 上的片段:https://jqplay.org/s/1m7wAeHMTu
【问题讨论】:
-
您从旧的 builtin.jq 复制。明智的做法是使用
keys_unsorted而不是keys。