gpt4 book ai didi

arrays - 使用 jq 删除与键匹配的对象和数组

转载 作者:行者123 更新时间:2023-12-04 13:36:41 26 4
gpt4 key购买 nike

我有一个包含以下内容的 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"
}
}
]
}

我复制了 jq的内置 walk函数来自 source .
# 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

最佳答案

你的问题是当type == "array"是真的.将是一个数组,所以 .userGroupAccesses不会工作。您要做的是关注 . 时的情况。是一个对象。在您调用 walk您只需要检查 type == "object"然后删除你不想要的成员。例如

walk(if type == "object" then del(.publicAccess, .userGroupAccesses) else . end)

Try it online at jqplay.org

您也可以在不使用 walk 的情况下解决此问题通过使用 Recursive Descent .. 例如
del(.. | .publicAccess?, .userGroupAccesses?)

Try it online at jqplay.org

关于arrays - 使用 jq 删除与键匹配的对象和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47371280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com