jq 以一种本身可以读取的方式输出路径的方法?

A way for jq to output paths in a way itself can read?

有没有办法使 jq 输出路径本身可以读取?

示例输入:

{
    "foo": [{
        "bar": 2,
        "bor": 3
    }]
}

输出"bar"的位置和值,例如:

jq -c 'tostream | select(.[0]|index("bar"))'
[["foo",0,"bar"],2]

有没有办法以 jq 路径选择格式输出路径,即 .foo[0].bar

据我所知,没有内置的方法可以做到这一点,但推出实施应该不会花费太多时间。

只有三种情况你需要担心:路径为空,路径包含字符串,路径包含数字。

如果为空,则仅指输入本身。如果它是一个字符串,它就是一个对象的 属性 。如果它是一个数字,它就是一个数组的索引。

所以你可以使用这个:

def to_expression($path): $path |
    if length == 0
        then "."
        else map(
            if type == "string"
                then ".\"\(.)\""
            elif type == "number"
                then "[\(.)]"
            else
                error("unexpected path type: \(type)")
            end
        ) | add
    end;

请注意,这始终将 属性 名称括在引号中。这不是严格要求的,但比试图弄清楚是否真的需要它更容易。

jq 可以 读取指定为 JSON 数组的路径。具体参见 getpathsetpathfromstream 也读取数组格式的路径。