У меня есть следующий код в сценарии командной строки:
output_json=$(jq -n \
--argjson ID "${id}" \
--arg Title "${title}" \
--argjson like "\"${like}\"" \
'$ARGS.named')
Я помещаю переменные id
, title
и like
в jq
. Я получаю следующий вывод:
[
{
"ID": 6,
"Title": "ABC",
"like": ""
},
{
"ID": 22,
"Title": "ABC",
"like": "Yes"
}
]
Но я пытаюсь получить вывод в следующем формате, то есть с нулевым значением:
[
{
"ID": 6,
"Title": "ABC",
"like": null
},
{
"ID": 22,
"Title": "ABC",
"like": "Yes"
}
]
Я не совсем понимаю, это вообще возможно, или это проблема с моей командой jq
?
И насколько я понял "like": ""
это не то же самое что "like": null
. Я тоже сейчас немного запутался и не совсем понимаю, какой правильный выбор использовать.
Используя --argjson
, вам необходимо указать допустимый аргумент в формате JSON, поэтому, если вы хотите получить null
, значение должно быть буквально null
. Ваше решение, однако, добавляет кавычки вокруг него, поэтому его никогда нельзя оценить как null
. (Кроме того, это будет допустимой строкой JSON, только если она соответствует кодировке JSON для специальных символов, таких как сами символы кавычек).
Если вы хотите иметь строку JSON в обычном случае и null
в случае, когда она пуста, импортируйте содержимое ${like}
как строку, используя --arg
и без дополнительных кавычек (так же, как вы делаете с ${title}
), затем используйте немного jq
логика превращения пустой строки в null
. Оператор if
подойдет, например:
like=
jq -n --arg like "${like}" '{like: (if $like == "" then null else $like end)}'
{
"like": null
}
Спасибо за ваш ответ, теперь это имеет больше смысла. Есть ли способ подразумевать '${like}'' '{like: (if $like == "" then null else $like end)}'
непосредственно в моей команде? Если я это сделаю: ` output_json=$(jq -n \ --argjson ID "${id}" \ --arg Title "${title}" \ --arg like "${like}" '{like: ( if $like == "" then null else $like end)}' \ '$ARGS.named') ` получить следующий результат: ` [ { "like": null }, { "like": "Yes" } ] `
@KarlsD У вас может быть только один фильтр, поэтому вам нужно интегрировать оператор if
в ваш фактический фильтр (учитывая ваш пример, я подумал, что это просто фиктивный фильтр, поэтому я придумал еще один простой случай). Но если вы действительно хотите опираться только на $ARGS.named
, попробуйте $ARGS.named | .like |= if . == "" then null else . end
.
В соответствии с рекомендациями минимальный воспроизводимый пример было бы полезно, если бы вы могли показать значения интересующих переменных оболочки, т.е.
$like