【发布时间】:2022-10-02 17:24:25
【问题描述】:
我试图在 JSON 结构中深度修剪节点,我很困惑为什么 empty 的行为似乎与这里的正常值不同。
输入
[
{
\"name\": \"foo\",
\"children\": [{
\"name\": \"foo.0\",
\"color\": \"red\"
}]
},
{
\"name\": \"bar\",
\"children\": [{
\"name\": \"bar.0\",
\"color\": \"green\"
},
{
\"name\": \"bar.1\"
}]
},
{
\"name\": \"baz\",
\"children\": [{
\"name\": \"baz.0\"
},
{
\"name\": \"baz.1\"
}]
}
]
程序
jq \'(.[].children|.[])|=if has(\"color\") then . else empty end\' foo.json
实际输出
[
{
\"name\": \"foo\",
\"children\": [
{
\"name\": \"foo.0\",
\"color\": \"red\"
}
]
},
{
\"name\": \"bar\",
\"children\": [
{
\"name\": \"bar.0\",
\"color\": \"green\"
}
]
},
{
\"name\": \"baz\",
\"children\": [
{
\"name\": \"baz.1\"
}
]
}
]
预期产出
我得到的输出,除了没有baz.1 孩子,因为那个没有颜色。
问题
除了正确的解决方案之外,我还很好奇为什么将脚本中的empty 替换为42 之类的常规值会按预期将没有颜色的孩子替换为42,但是当替换为empty 时,它看起来像else 分支没有被执行?
-
baz孩子是从哪里来的?那不是在输入? -
@0stone0 抱歉,我从错误的文件中复制。现在修好了。