Json &引用;“三元逻辑”;对于返回值:foo、bar或error
我有两个不同的JSON结构来检索特定的对象值,基本上是这样的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),则返回附加变
{
"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
的层次结构,非常感谢。