Как управлять пустыми результатами выбора - PullRequest
0 голосов
/ 25 января 2019

У меня есть этот вход 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]?)}

У меня полностью пустой результат .

Как получить что-то вроде

{
  "label": "a",
  "test": ""
}

Как управлять этим с помощью jq?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

если вы не ограничены 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 $ 

ОБНОВЛЕНИЕ: начиная с jtc v.167 , аргумент cli (из -eu) требует дополнительного цитирования, например ::

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 $ 

PS. вы можете найти jtc на github.com или Google с ключевыми словами jtc и json

0 голосов
/ 25 января 2019

Вы можете использовать альтернативный оператор //.Выражение E // "" создаст пустую строку, если E пусто или null или false:

<file jq '.results[0]|{label:"a",test:((.address_components[].types|select(.[0]| contains("administrative_area_level_3"))|.[1])//"")}'

Обратите внимание, что в данном случае вам не нужен оператор ?.

...