如果JSON数组中还没有值,请将其插入



我正在构建一个bash脚本,该脚本将从API读取响应,并在[]列表(而不是{}数组(中插入一个值(如果该值不存在(。API的虚假示例响应:

#response.json contains:
{
"foods": {
"menu": [
"tacos",
"spaghetti",
"pizza",
"chicken_florentine",
"bacon_cheeseburge",
"chow_mein",
"sushi",
"chocolate",
"whiskey"
]
}
}

我的bash脚本中的变量是order="lasagna"。如果'foods.menu[]'包含$order,则不执行任何操作,否则将$order值插入到'foods.menu[]'中。

使用目前'foods.menu[]'中不存在的bash变量order="lasagna",得到的json应该是:

{
"foods": {
"menu": [
"tacos",
"spaghetti",
"pizza",
"chicken_florentine",
"bacon_cheeseburge",
"chow_mein",
"sushi",
"chocolate",
"whiskey",
"lasagna" <----
]
}
}

我开始尝试bashfor循环和jq的if-then-elseselectcontains的变体,但失败了。感谢您的帮助。

您不需要的循环

jq --arg order lasagna '.foods.menu |= if index($order) then . else . + [$order] end' response.json

但你可能需要一个插入多个订单

jq 'reduce $ARGS.positional[] as $order (.;
.foods.menu |= if index($order) then . else . + [$order] end
)' response.json --args apple banana sushi

我不知道这是否符合任何不言而喻的要求。

无论如何添加项目,然后unique结果:

echo "$result" | jq --arg order pizza '.foods.menu |= (. + [$order] | unique)'
{
"foods": {
"menu": [
"bacon_cheeseburge",
"chicken_florentine",
"chocolate",
"chow_mein",
"pizza",
"spaghetti",
"sushi",
"tacos",
"whiskey"
]
}
}

对生成的数组进行排序。如果输入中有任何重复项,则这些重复项将消失。

以下是另一种使用替代运算符//默认为数组的length作为项索引的方法:

jq --arg order 'lasagna' '
(.foods.menu | .[index($order) // length]) = $order
' response.json

以相同方式添加项目列表:

jq '.foods.menu |= reduce $ARGS.positional[] as $order (.;
.[index($order) // length] = $order
)' response.json --args 'lasagna' 'sushi' 'milk'

最新更新