如何管理空选择结果

时间:2019-01-25 07:57:16

标签: json jq

我有此输入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进行管理?

2 个答案:

答案 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