JQ преобразовать в число, преобразовать в логическое значение при генерации нового JSON из переменных оболочки - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь сгенерировать вывод json, если входные данные поступают от переменных оболочки.

happystring="Bob Ross"
unhappynumber1="1942"
unhappyboolean=true

JSON=$(jq -n \
        --arg happystring "$happystring" --arg unhappynumber1 "$unhappynumber1" \
        --arg unhappyboolean $unhappyboolean \
        '
        {
            happystring: $happystring,
            unhappynumber1: $unhappynumber1,
            unhappyboolean: $unhappyboolean
        }
        ')

echo "$JSON" | jq

Создает этот вывод:

{
  "happystring": "Bob Ross",
  "unhappynumber1": "1942",
  "unhappyboolean": "true"
}

Я знаю, что могу использовать tonumberпреобразовать строку в число в простом фильтре.Тем не менее, я не могу понять, как преобразовать строку в логическое значение.И мне трудно рассуждать, как это сделать, когда я получаю данные из shell shell и создаю новый json в качестве вывода.

Желаемый вывод:

{
  "happystring": "Bob Ross",
  "unhappynumber1": 1942,
  "unhappyboolean": true
}

Было бы проще или яснее, если бы япроизвел json и сохранил его в оболочке var за один шаг, а затем выполнил дополнительное преобразование на втором шаге?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Нет необходимости преобразовывать переменные в строки, как --arg делает только для того, чтобы преобразовать их обратно, вы можете использовать --argjson и по-прежнему вводить их отдельно, но с типами, определенными обычными правилами JSON:

happystring='"Bob Ross"'
unhappynumber1=1942
unhappyboolean=true

JSON=$(jq -n \
      --argjson happystring "$happystring" \
      --argjson unhappynumber1 "$unhappynumber1" \
      --argjson unhappyboolean "$unhappyboolean" \
      '
      {
          happystring: $happystring,
          unhappynumber1: $unhappynumber1,
          unhappyboolean: $unhappyboolean
      }
      ')

      echo "$JSON"

Вы также можете смешать --arg для строк и --argjson для всего остального, если вы предпочитаете не использовать буквальные кавычки " для строковых аргументов, как примечание в руководстве по цитированию оболочки иТекст программы действительно применим к любым аргументам с символами, которые вы должны экранировать в своей оболочке:

Примечание: важно соблюдать правила цитирования оболочки.Как правило, лучше всегда заключать в кавычки (с одинарными кавычками) программу jq, так как слишком много символов, имеющих особое значение для jq, также являются метасимволами оболочки.Например, jq "foo" не будет работать в большинстве оболочек Unix, потому что это будет то же самое, что и jq foo, что, как правило, приведет к сбою, потому что foo не определен.При использовании командной оболочки Windows (cmd.exe) лучше использовать двойные кавычки вокруг вашей jq-программы, если они указаны в командной строке (вместо опции -f program-file), но тогда двойные кавычки в jq-программе требуютобратную косую черту.

0 голосов
/ 22 февраля 2019

Вы можете использовать фильтр test, чтобы выполнить проверку и вернуть true / false.И я думаю, что вы можете просто использовать фильтры напрямую, не нужно создавать json и конвертировать снова.

happystring="Bob Ross"
unhappynumber1="1942"
unhappyboolean=true

JSON=$(jq -n \
        --arg happystring "$happystring" --arg unhappynumber1 "$unhappynumber1" \
        --arg unhappyboolean $unhappyboolean \
        '
        {
            happystring: $happystring,
            unhappynumber1: $unhappynumber1 | tonumber,
            unhappyboolean: $unhappyboolean | test("true")
        }
        ')

echo "$JSON" | jq

даст вывод как:

{
  "happystring": "Bob Ross",
  "unhappynumber1": 1942,
  "unhappyboolean": true
}
...