JQ выбрать подмножество вложенных ключей - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь построить слой SQL поверх jq для файлов json, и я хотел бы реализовать выбор.Итак, я получил следующее:

 function join() {
     # If no arguments, do nothing.
     # This avoids confusing errors in some shells.
     if [ $# -eq 0 ]; then
         return
     fi

     local joiner="$1"
     shift

     while [ $# -gt 1 ]; do
         printf "%s%s" "$1" "$joiner"
         shift
     done

     printf '%s\n' "$1"
 }

 function jselect {
     keys=`join "\":1, \"" $@`
     jq "with_entries(select(.key | in({\"$keys\":1})))"
 }

позволяет мне делать

$ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jselect success results

>>> {
  "success": true,
  "results": {
    "a": "...",
    "b": "...",
    "c": "..."
  }
}

, но я хотел бы иметь возможность индексировать вложенные свойства, например что-то вроде:

$ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jselect success results

>>> {
  "success": true,
  "results": {
    "b": "..."
  }
}

or

>>> {
  "success": true,
  "results.b": "..."
}

Есть идеи?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Если я не понял, о чем вы спрашиваете, я думаю, что нет необходимости в дополнительном сценарии оболочки, вы можете использовать простой jq сценарий:

echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jq '{ success, results }'

Jq-сценарий выбирает только2 объекта, которые вы хотите.Обратите внимание на более короткую форму, которая использует 1 ключевое слово на объект (вместо "success":.success).

echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jq '{ success, "results.b":.results.b }'    

Этот сценарий почти такой же, за исключением того, что имя объекта является явным.

0 голосов
/ 23 апреля 2019

в качестве альтернативного решения, вы можете рассмотреть возможность использования Unix-инструмента Walk-Path jtc для манипулирования JSON - используя jtc, существует несколько способов выполнить ваш запрос, но самым лучшим будет оставить в JSON только те записи, которые прошли (и очистить все остальное):

bash $ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jtc -w[success] -w[results][b] -pp
{
   "results": {
      "b": "..."
   },
   "success": true
}
bash $ 
...