Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json &引用;“三元逻辑”;对于返回值:foo、bar或error_Json_Batch Processing_Jq - Fatal编程技术网

Json &引用;“三元逻辑”;对于返回值:foo、bar或error

Json &引用;“三元逻辑”;对于返回值:foo、bar或error,json,batch-processing,jq,Json,Batch Processing,Jq,我有两个不同的JSON结构来检索特定的对象值,基本上是这样的 { "one": { "foo": { "bar": "baz" } } } 还有一个这样的 { "two": { "foo": { "bar": "qux" } } } 我希望在两种情况下都返回条值,如果情况1-baz-或情况2-qux-与任何内容都不匹配(即匹配null),则返回附加变

我有两个不同的JSON结构来检索特定的对象值,基本上是这样的

{
    "one": {
        "foo": {
            "bar": "baz"
        }
    }
}
还有一个这样的

{
    "two": {
        "foo": {
            "bar": "qux"
        }
    }
}
我希望在两种情况下都返回
值,如果情况1-
baz
-或情况2-
qux
-与任何内容都不匹配(即匹配
null
),则返回附加变量
error

只有JQ1.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"
        }
    }
}
我需要
id
值(*gecko.id)或
error
如果没有:

{95ad7b39-5d3e-1029-7285-9455bcf665c0}
j30D-3YFPUvj9u9izFoPSjlNYZfF22xS@foobar
error

我想你在找我

例如:

var value;
if(applications.gecko.hasOwnProperty('id'))
   value = applications.gecko.id;
else
   value = 'error';

您可以结合使用
“错误抑制”和
/
“可选”运算符:

jq -n --slurpfile variantA yourFirstFile --slurpfile variantB yourSecondFile \
'(
  ($variantA[0].browser_specific_settings.gecko.id)?, 
  ($variantB[0].applications.gecko.id)?
) // "error"'
这将输出第一个文件的id和/或第二个文件的id(如果两个文件中有任何一个存在),避免在它们不存在时引发错误,如果找不到它们,则输出
error

如果该命令在您的上下文中有意义,可以将其缩短如下:

jq -n --slurpfile variantA yourFirstFile --slurpfile variantB yourSecondFile \
'(($variantA[0].browser_specific_settings, $variantB[0].applications) | .gecko.id)? // "error"'

您可以使用如下所示的过滤器,该过滤器可以与提供的示例JSON内容一起工作

jq '.. | if type == "object" and has("id") then .id else empty end'
看着他们生活和生活

注意:当存在
.id
时,仅获取其值,当对象不包含所需字段时,请参见其他答案()以显示
错误。

(..|对象|选择(具有(“id”)。id/“错误”
这将适用于多个文件和包含多个单独实体的文件

我需要id值(*gecko.id)或错误(如果没有):

{95ad7b39-5d3e-1029-7285-9455bcf665c0}
j30D-3YFPUvj9u9izFoPSjlNYZfF22xS@foobar
error
根据您的符号
“*gecko.id”
,这里有两种解决方案,第一种是将“*”解释为单个未知键(或索引),第二种是将其(或多或少)解释为任意数量的键或索引:

.[] | .gecko.id // "error"
如果你真的不在乎是否有“壁虎”钥匙,你可以考虑:

first(.. | objects | select(has("id")).id ) // "error"

是的,但是值
baz
qux
可能不同。路径,即这两个变体,已知存在。OP正在寻找使用jq而不是JavaScript的解决方案。@oguzismail关于slurpfile:据我所知,OP希望返回一个键和/或另一个键(如果存在这两个键中的任何一个),并且“错误”“如果没有,如果我们想在
jq
中实现这一点,就需要同时读取两个文件。关于硬编码键:我不确定OP是否要在
.gecko.id
路径中搜索任何对象,在这种情况下,您是正确的,
是一种方法,或者对于多个不同的特定对象,在这种情况下,硬编码它们的路径是有意义的。我知道你是如何理解的,但我觉得OP的问题也给我留下了解释的空间。关于slurpfile部分:我没有考虑过你可以将多个文件作为简单参数传递,并让
jq
处理它们的合并内容,就像你的回答一样。仍然取决于OP是否希望处理特定文件及其相关的特定键,如果不是这样,我的答案就不必要地复杂了。我将编辑if OP clearthesis我将坚持上面的方法,因为jq在一个脚本中运行,该脚本将随机的xpi文件作为参数进行处理,所以我一次有一个文件要用jq解析。不过,这个变体看起来也很有趣。这与我所寻找的一样,而且它尊重
*gecko.id
的层次结构,非常感谢。