Drupal 基于子数组值获取对象密钥

Drupal 基于子数组值获取对象密钥,drupal,drupal-8,jq,Drupal,Drupal 8,Jq,我有一个JSON定义了一些服务: { "services": { "main_content_renderer.off_canvas": { "class": "Drupal\\settings_tray\\Render\\MainContent\\OffCanvasRenderer", "arguments": [ "@title_resolver", "@renderer" ], "tags": [

我有一个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\u check.settings\u tray.block.settings\u tray\u form
,用于输入
access\u check

我尝试了各种方法,但我要么得到了
jq:error(at:20):无法使用字符串“name”为数组编制索引,要么只是语法错误

示例:

jq.services| to|u条目|映射(选择(.value.tags.[].name==“访问检查”))”

这会导致语法错误:
jq:error:syntax error,意外的“[”,需要格式或QQSTRING_START(Unix shell引用问题?),在第1行:

jq'.services| to|u entries | map(select(.value.tags |.name==“paramconverter”)”
生成

jq:error(at:20):无法使用字符串“name”索引数组


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

这里有一个解决方案。如果以下筛选器位于
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

所以,如果我理解您的输入和输出,您需要一个服务名,如果它包含一个给定的标记名

我会这样写的

$ jq --arg name "access_check" '
.services | to_entries[] | select(any(.value.tags[].name; . == $name)).key
' input.json
您的尝试很接近,但存在一些语法问题:

  • .value.tags.[].name

    通过在
    []
    前面加上点,语法现在无效。它应该是
    .value.tags[].name
  • .value.tags |.name

    tags
    是一个数组,它可能没有名为
    name
    的属性

  • 谢谢,基于所有这些,我发布了一个完整的shell脚本,用于在Drupal8中通过标记对服务进行grepping