传递嵌套json参数变量作为JQ json库的键



我有两个JSON文件,我要传递给jq对象,检查下面:

Create.json

{
"email_notifications": {
"on_failure": "_"
},
"name": "_",
"schedule": {
"quartz_cron_expression": "_",
"timezone_id": "Europe/Amsterdam",
"pause_status": "_"
}
}

Update.json

{
"job_id": "_",
"new_settings": {
"email_notifications": {
"on_failure": "_"
},
"name": "_",
"schedule": {
"quartz_cron_expression": "_",
"timezone_id": "Europe/Amsterdam",
"pause_status": "_"
}
}

创建。Json我可以使用下面的表达式:

TEMPLATE=`cat $FILE | jq
--arg _parent "$PARENT"
--arg _job_name "$JOB_NAME"
' ( . | .name ) |= $_job_name
| ( . | .schedule.pause_status) |= $_parent'
`

更新。我需要使用表达式来包含父键名:

TEMPLATE=`cat $FILE | jq
--arg _parent "$PARENT"
--arg _job_name "$JOB_NAME"
' ( .["new_settings"] | .name ) |= $_job_name
| ( .["new_settings"] | .schedule.pause_status) |= $_parent'

为了处理这个问题,我在表达式中使用了if else,它工作得很好:(if .job_id?然后,["new_settings"] else。End | .name) |= $_job_name

,但我想传递初始部分作为参数,但它不起作用,并给出一个语法错误。我怎样才能使参数在运行时变成一个动态的表达式呢?

Filter="." OR Filter=".["new_settings"]"
TEMPLATE=`cat $FILE | jq
--arg filter "$Filter"
--arg _parent "$PARENT"
--arg _job_name "$JOB_NAME"
' ( $filter | .name ) |= $_job_name
| ( $filter | .schedule.pause_status) |= $_parent'
# --arg root_path ""
# --arg root_path "new_settings"
getpath( $root_path | split(".") ) |= (
.name                  = $_job_name |
.schedule.pause_status = $_parent
)

参数不应该是一段jq代码。接受一段jq代码传递给eval是一种不好的做法。但是jq甚至没有eval,所以它甚至不是一个选项。

我们可以使用JSON数组提供一个路径。

# --argjson root_path '[]'
# --argjson root_path '["new_settings"]'
getpath($root_path)

但是点分隔的路径更好。

# --arg root_path ""
# --arg root_path "new_settings"
getpath( $root_path | split(".") )                           # Supports objects
getpath( $root_path | split(".") | map( tonumber? // . ) )   # Supports objects & arrays

这给了我们像这样的东西:

getpath( $root_path | split(".") ) as $root |
( $root | .name                  ) |= $_job_name |
( $root | .schedule.pause_status ) |= $_parent

除了使用$root两次没有意义。

getpath( $root_path | split(".") ) as $root |
$root |= (
.name                  |= $_job_name |
.schedule.pause_status |= $_parent
)

还是

getpath( $root_path | split(".") ) |= (
.name                  |= $_job_name |
.schedule.pause_status |= $_parent
)

=|=之间的唯一区别是右边提供的上下文(.)。因此,之前存在的两个|=可以简化为=

getpath( $root_path | split(".") ) |= (
.name                  = $_job_name |
.schedule.pause_status = $_parent
)

jqplayCreate.jsonDemo
jqplayUpdate.jsonDemo

相关内容

  • 没有找到相关文章

最新更新