首页 > 解决方案 > jq:传递变量参数以用作过滤器

问题描述

如何将变量参数传递给将用作过滤器的 JQ 程序。由于默认情况下 --arg 将参数作为用引号括起来的字符串传递,因此不能用于应用过滤器。

这是在给定 json 中查找特定路径并向该路径添加静态键值但由于引号问题而不起作用的 JQ 程序。

--argjson name '{ "pattern": "XYZ"}' 'def p: "." + (paths | select(.[-1] == "p-enum") | .[0:-1] | join(".")) ; .|p += $name' sample.json

这是示例 json

{
  "type": "object",
  "description": "Contains information.",
  "properties": {
    "type": {
      "description": "Type.",
      "type": "string",
      "p-enum": [
        {
          "value": "IND",
          "description": "Ind."
        },
        {
          "value": "PROP",
          "description": "Prop."
        }
      ]
    }
  }
}

标签: jq

解决方案


根据我如何解释您在其他问题中使用 jq 的方式,这取决于您的过滤器的复杂程度。任何要被解释的论点jq都不是你应该接近它的方式。这相当于 usingeval()并且不仅不受支持,而且不是解决此问题的好方法。

如果您只是访问输入的属性,则有几种方法可以使用简单索引或getpath/1用于嵌套路径。

# indexing
# { "properties": ... }
$ jq --arg p 'properties' '.[$p]' input.json
# using getpath
# { "foo": { "bar": ... } }
$ jq --argjson path '["foo","bar"]' 'getpath($path)' input.json

推荐阅读