使用 JQ 根据密钥的存在或不存在采取行动
Acting on the existence or non-existence of a key using JQ
我有一个 JSON 文件,其中包含彼此相似但不完全相同的对象。所有对象都有一个主标识符,但对象中可能存在也可能不存在其他键。
我的问题:对于对象中的给定键,如果它存在,我如何打印出该值,如果不存在,我该如何打印出类似 "NA" 的内容,无论哪种方式都打印出键的原始名称?
示例输入:
{
"DBInstances": [
{
"Identifier": 101,
"foo": "some_value",
"bar": 60,
"Model": "A"
},
{
"Identifier": 102,
"foo": "some_value",
"Model": "B"
}
]
}
期望的输出:
{
"Identifier": 101,
"foo": "some_value",
"bar": 60,
"Model": "A"
},
{
"Identifier": 102,
"foo": "some_value",
"bar": "NA",
"Model": "B"
}
我创建了一个函数(部分)适用于不存在,但根本不适用于存在:
def exist(element):
if (has( element ) == true)
then { element: "true" }
else { element: "NA" }
end;
当我调用它时:
exist( "bar" )
"existence" 部分是完全错误的,因为 JQ 打印了 "element" 和 "true" 而不是原来的键名和值。
对于 "non-existence" 部分,JQ 打印 "NA" 就好了,但是 "element" 而不是原来的键名。
我正在使用 JQ 1.3。
这是编写 "exist" 定义的正确方法:
def exist(element):
if has( element )
then { (element): .[element] }
else { (element): "NA" }
end;
这已通过 jq 1.3 测试,但请尝试升级到更新的版本。
在实践中,人们更可能使用这样的成语:
if has(element) then . else .[element] = "NA" end
这是另一个使用 update assignment |=
的解决方案
.DBInstances[] | .bar |= if .==null then "NA" else . end
我有一个 JSON 文件,其中包含彼此相似但不完全相同的对象。所有对象都有一个主标识符,但对象中可能存在也可能不存在其他键。
我的问题:对于对象中的给定键,如果它存在,我如何打印出该值,如果不存在,我该如何打印出类似 "NA" 的内容,无论哪种方式都打印出键的原始名称?
示例输入:
{
"DBInstances": [
{
"Identifier": 101,
"foo": "some_value",
"bar": 60,
"Model": "A"
},
{
"Identifier": 102,
"foo": "some_value",
"Model": "B"
}
]
}
期望的输出:
{
"Identifier": 101,
"foo": "some_value",
"bar": 60,
"Model": "A"
},
{
"Identifier": 102,
"foo": "some_value",
"bar": "NA",
"Model": "B"
}
我创建了一个函数(部分)适用于不存在,但根本不适用于存在:
def exist(element):
if (has( element ) == true)
then { element: "true" }
else { element: "NA" }
end;
当我调用它时:
exist( "bar" )
"existence" 部分是完全错误的,因为 JQ 打印了 "element" 和 "true" 而不是原来的键名和值。
对于 "non-existence" 部分,JQ 打印 "NA" 就好了,但是 "element" 而不是原来的键名。
我正在使用 JQ 1.3。
这是编写 "exist" 定义的正确方法:
def exist(element):
if has( element )
then { (element): .[element] }
else { (element): "NA" }
end;
这已通过 jq 1.3 测试,但请尝试升级到更新的版本。
在实践中,人们更可能使用这样的成语:
if has(element) then . else .[element] = "NA" end
这是另一个使用 update assignment |=
的解决方案 .DBInstances[] | .bar |= if .==null then "NA" else . end