我有此输入JSON
{
"results" : [
{
"address_components" : [
{
"long_name" : "Amsterdam",
"short_name" : "Amsterdam",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Government of Amsterdam",
"short_name" : "Government of Amsterdam",
"types" : [ "administrative_area_level_2", "political" ]
}
]
}
]
}
如果我将此过滤器与jq一起应用
.results[0]|{label:"a",test:(.address_components[].types|select(.[0]| contains("administrative_area_level_2"))|.[1]?)}
我有结果
{
"label": "a",
"test": "political"
}
如果我在中修改过滤器(这是一个空选择)
.results[0]|{label:"a",test:(.address_components[].types|select(.[0]| contains("administrative_area_level_3"))|.[1]?)}
我有一个完全empty result的人。
如何获得类似的东西
{
"label": "a",
"test": ""
}
如何使用jq进行管理?
答案 0 :(得分:2)
您可以使用替代运算符//
。如果E为空或E // ""
或null
,则表达式false
将产生空字符串:
<file jq '.results[0]|{label:"a",test:((.address_components[].types|select(.[0]| contains("administrative_area_level_3"))|.[1])//"")}'
请注意,在当前情况下,您不需要?
运算符。
答案 1 :(得分:2)
如果您不仅仅局限于jq,请允许我为您提供我最近开发的另一种工具-jtc
,使用该工具您的要求看起来像(假设json位于file.json
中):
bash $ echo '{ "label": "a", "test": "" }' | jtc -w'<test>l' -eu jtc -w'<administrative_area_level_2> [-1] [1]' file.json \;
{
"label": "a",
"test": "political"
}
bash $ echo '{ "label": "a", "test": "" }' | jtc -w'<test>l' -eu jtc -w'<administrative_area_level_3> [-1] [1]' file.json \;
{
"label": "a",
"test": ""
}
bash $
PS。您可能会在github.com上找到jtc
,或者在Google上搜索关键字jtc和json