Jq function: jq Manual (development version)

json — передача аргументов в фильтр jq

спросил

Изменено 2 года, 2 месяца назад

Просмотрено 100 тысяч раз

Вот мой config.json:

 {
    "окружение": "разработчик",
    "разработчик": {
        "проекты" : {
            "prj1": {
                "зависимости": {},
                "описание": ""
            }
        }
    }
}
 

Вот мои команды bash:

 PRJNAME='prj1'
эхо $PRJNAME
jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json
jq '.dev.projects.prj1' config.json
 

Вывод:

 prj1
нулевой
{
  "зависимости": {},
  "описание": ""
}
 

Итак, $PRJNAME — это prj1, но первый вызов выводит только null .

Кто-нибудь может мне помочь?

  • json
  • bash
  • передача параметров
  • jq

2

Программа jq . dev.projects."$v" в вашем примере буквально попытается найти ключ с именем "$v" . Вместо этого попробуйте следующее:

 jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json
 

4

Вы также можете использовать --argjson при создании json.

 --arg a v # установить переменную $a в значение ;
--argjson a v # установить переменную $a в значение JSON ;
 

1

Как было сказано в комментарии выше, есть способ передать несколько аргументов. Может быть, есть более элегантный способ, но он работает.

  • Если вы уверены, что всегда нужны все ключи, вы можете использовать это:
 jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '
 

  • Если ключ не всегда используется, вы можете сделать это так:
 jq --arg ключ $k ' если ключ != "" то . [$key] иначе . конец'
 

  • Если ключ иногда ссылается на массив:
 jq --arg ключ $k ' если тип == "массив", то .[$key |tonumber] иначе .[$key] конец'
 

Конечно, вы можете комбинировать их!

2

вы можете сделать это:

    ключ = "dev.projects.prj1"
    фильтр=".$ключ"
    кот config.json | jq $фильтр
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

json — Как проверить наличие «ключа» в jq перед повторением значений

Задавать вопрос

спросил

Изменено 1 год, 3 месяца назад

Просмотрено 103 тысячи раз

Я получаю Невозможно перебрать значение null (null) из приведенного ниже запроса, потому что . property_history отсутствует в объекте результата .

Как проверить наличие ключа .property_history , прежде чем продолжить работу с map(...) ?

Я пытался использовать что-то вроде sold_year= `echo "$content" | jq 'если есть ("property_history"), то map(select(.event_name == "Sold"))[0].date' else null end

Исходный запрос:

 sold_year=`echo "$content" | jq '.result.property_history | карта (выберите (.event_name == "Продано")) [0].date'`
 

JSON:

 {
   "результат":{
      "property_history":[
         {
            "дата": "27.01.2016",
            "цена_изменена":0,
            "цена":899750,
            "event_name":"В списке",
            "квадратный фут":0
         },
         {
            "дата": "15.12.2015",
            "цена_изменена":0,
            "цена":899750,
            "event_name":"В списке",
            "квадратный фут": 2357
         },
         {
            "дата": "30.
08.2004", "цена_изменена":0, "цена":739000, "event_name":"Продано", "квадратный фут": 2357 } ] } }
  • json
  • баш
  • jq

0

Вы можете использовать выражение выбора в jq , чтобы сделать то, что вы намереваетесь достичь, например,

 jq '.result
  | выберите (.property_history! = ноль)
  | .property_history
  | карта (выберите (.event_name == "Продано")) [0]. date'
 

3

Технически, чтобы проверить наличие свойства, вы должны использовать has/1 , но в данном контексте лучше использовать постфикс ? оператор, например:

 $ jq '.результат
  | .property_history[]?
  | выберите (.event_name == "Продано")
  | .свидание'
"30.08.2004"
 

4

используйте has("mykey1") (для объектов) или has(0) (для массивов):

 jq 'has("name")' <<< "{\"name\": \ "привет\"}"
 

вывод:

 правда
 

7

Хитрость заключается в использовании // вместе с empty:

 jq '.		

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *