根据子阵列值获取对象键

时间:2017-09-11 15:20:17

标签: drupal drupal-8 jq

我有一个JSON定义了一些服务:

{
  "services": {
    "main_content_renderer.off_canvas": {
      "class": "Drupal\\settings_tray\\Render\\MainContent\\OffCanvasRenderer",
      "arguments": [
        "@title_resolver",
        "@renderer"
      ],
      "tags": [
        {
          "name": "render.main_content_renderer",
          "format": "drupal_dialog.off_canvas"
        }
      ]
    },
    "access_check.settings_tray.block.settings_tray_form": {
      "class": "Drupal\\settings_tray\\Access\\BlockPluginHasSettingsTrayFormAccessCheck",
      "tags": [
        {
          "name": "access_check",
          "applies_to": "_access_block_plugin_has_settings_tray_form"
        }
      ]
    }
  }
}

我想写一个jq程序,为输入access_check.settings_tray.block.settings_tray_form返回access_check

我尝试了各种各样的事情,但我得到jq: error (at <stdin>:20): Cannot index array with string "name"或只是语法错误。

示例:

jq '.services| to_entries|map(select(.value.tags.[].name == "access_check")))'

这会导致语法错误:jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:

jq '.services| to_entries|map(select(.value.tags|.name == "paramconverter"))'结果

jq: error (at <stdin>:20): Cannot index array with string "name"

编辑:虽然示例没有显示可以有多个标签。

2 个答案:

答案 0 :(得分:1)

这是一个解决方案。如果以下过滤器位于filter.jq

  .services
| keys[] as $k
| .[$k]
| select(.tags[]?.name == $name)
| $k

,样本数据在data.json,然后是命令

$ jq -Mr --arg name 'access_check' -f filter.jq data.json

产生

access_check.settings_tray.block.settings_tray_form

答案 1 :(得分:0)

因此,如果我了解您的输入和输出,您需要一个服务名称,如果它包含给定的标记名称。

我会这样写。

$ jq --arg name "access_check" '
.services | to_entries[] | select(any(.value.tags[].name; . == $name)).key
' input.json

您的尝试很接近,但有一些语法问题:

  1. .value.tags.[].name
    通过在[]之前加上点,语法现在无效。应该是.value.tags[].name
  2. .value.tags|.name
    tags是一个数组,它可能没有名为name的属性。