Drupal 基于子数组值获取对象密钥
我有一个JSON定义了一些服务: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": [
{
"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