我有一个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"
编辑:虽然示例没有显示可以有多个标签。
答案 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
您的尝试很接近,但有一些语法问题:
.value.tags.[].name
[]
之前加上点,语法现在无效。应该是.value.tags[].name
。.value.tags|.name
tags
是一个数组,它可能没有名为name
的属性。