json 如何按键过滤

gcuhipw9  于 2023-05-19  发布在  其他
关注(0)|答案(3)|浏览(87)

我有这样的JSON:

[
    {
        "source": 
        {
            "file": "test",
            "baz": "now"
        }
    },
    {
        "source": {
            "dev": "foo"
        }
    },
    
    {
        "source": {
            "bar": "bar"
        }
    }
]

我想得到filedev的所有值的列表。因此,上述预期结果应该是:["test", "foo"]
我被困在这里:

.[].source | select(.file? or .dev?)

但这就产生了完整的物体。如何只访问比的属性值??

vsaztqbk

vsaztqbk1#

您可以使用.source | .file, .dev.source["file", "dev"]同时遍历.file.dev,然后使用values(而不是?)过滤空值。

map(.source | .file, .dev | values)
# or
map(.source["file", "dev"] | values)
[
  "test",
  "foo"
]
5anewei6

5anewei62#

不使用?或其他运算符,而使用getpath/1是一种选择,您可以只过滤路径并获取它们的值

[ getpath(paths | select(.[-1] == "file" or .[-1] == "dev")) ]

或者甚至合并另一个条件来检查source键,如果你想完全确定的话。.[-2] == "source"
演示-https://jqplay.org/s/IddhVIbUenj

wwodge7n

wwodge7n3#

下面是另一个使用tostream的选项,它本质上将下降到任何深度并提取"file""dev"键的值。

[ tostream | select(.[1] and (.[0][-1] | IN("file", "dev"))) | .[1] ]

jqplay.org上试试。

相关问题