返回值的“三元逻辑”:foo、bar 或 error

dab*_*l0r 3 json batch-processing jq

我有两种不同的 JSON 结构可以从中检索特定的对象值,基本上是这样的

{
    "one": {
        "foo": {
            "bar": "baz"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个这样的

{
    "two": {
        "foo": {
            "bar": "qux"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想bar在两种情况下都返回值加上一个额外的返回变量error,以防 case 1  baz- 也没有 case 2  qux- 匹配任何东西(即匹配null)。

仅使用 jq 1.6 有没有一种简单的方法可以做到这一点?

更新: 以下是实际 JSON 文件的片段:

/* manifest.json, variant A */
{
    "browser_specific_settings": {
        "gecko": {
            "id": "{95ad7b39-5d3e-1029-7285-9455bcf665c0}",
            "strict_min_version": "68.0"
        }
    }
}

/* manifest.json, variant B */
{
    "applications": {
        "gecko": {
            "id": "j30D-3YFPUvj9u9izFoPSjlNYZfF22xS@foobar",
            "strict_min_version": "53.0"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要id值(*gecko.id 可以这么说)或者error如果没有:

{95ad7b39-5d3e-1029-7285-9455bcf665c0}
j30D-3YFPUvj9u9izFoPSjlNYZfF22xS@foobar
error
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 5

您可以使用下面的过滤器,它可以与您提供的示例 JSON 内容一起使用

jq '.. | if type == "object" and has("id") then .id else empty end'
Run Code Online (Sandbox Code Playgroud)

现场观看 jqplay - VariantAjqplay - VariantB

注意:这仅获取.id存在时的值,请参阅其他答案(oguz ismail 的)以error在对象不包含必填字段时显示。