You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSONPath如何转义点、花括号、井号键名筛选Zabbix数据对象

问题背景

现有一份Zabbix自动发现规则生成的JSON结构数据,内容如下:

[{
    "{#SERVICE.NAME}": ".WindowsService1",
    "{#SERVICE.DISPLAYNAME}": ".WindowsService1 - Testing",
    "{#SERVICE.DESCRIPTION}": "Application Test 1 - Master",
    "{#SERVICE.STATE}": 0,
    "{#SERVICE.STATENAME}": "running",
    "{#SERVICE.PATH}": "E:\\App\\Test\\bin\\testingApp.exe",
    "{#SERVICE.USER}": "LocalSystem",
    "{#SERVICE.STARTUPTRIGGER}": 0,
    "{#SERVICE.STARTUP}": 1,
    "{#SERVICE.STARTUPNAME}": "automatic delayed"
},
{
    "{#SERVICE.NAME}": ".WindowsService2",
    "{#SERVICE.DISPLAYNAME}": ".WindowsService2 - Testing",
    "{#SERVICE.DESCRIPTION}": "Application Test 2 - Slave",
    "{#SERVICE.STATE}": 0,
    "{#SERVICE.STATENAME}": "running",
    "{#SERVICE.PATH}": "E:\\App\\Test\\bin\\testingApp.exe",
    "{#SERVICE.USER}": "LocalSystem",
    "{#SERVICE.STARTUPTRIGGER}": 0,
    "{#SERVICE.STARTUP}": 1,
    "{#SERVICE.STARTUPNAME}": "automatic delayed"
}]

需求为通过JSONPath筛选出{#SERVICE.NAME}属性值等于.WindowsService1的对象。
编写表达式过程中持续报错,已尝试的写法与测试结果如下:

  • 首次尝试的表达式:
$.[?(@.{#SERVICE.NAME} == '.WindowsService1')]

返回报错信息:

jsonPath: Unexpected token '{': _$_v.{#SERVICE.NAME} == '.WindowsService1'

  • 后续尝试正则匹配写法:
$.[?(@.{#SERVICE.NAME} =~ '^(.WindowsService1$)')]

返回完全相同的报错,可确认问题与==或=~后的匹配逻辑无关。
测试验证:若移除JSON键名中的{}、#特殊字符,将键名内的.替换为_(例如把{#SERVICE.NAME}改为SERVICE_NAME),则表达式$.[?(@.SERVICE_NAME == '.WindowsService1')]可正常执行。但业务场景要求必须保留Zabbix原生的JSON结构,不能修改键名,需要找到特殊字符键名的正确访问方式。


解决方案

报错的核心原因是JSONPath的点号属性访问语法(即@.键名格式)仅支持由字母、数字、下划线组成的合法标识符键名,当键名包含{、#、.这类特殊字符时,不能直接用点号拼接键名访问属性,需要改用方括号+引号包裹完整键名的语法取值。

可正常执行的JSONPath表达式如下:

$.[?(@['{#SERVICE.NAME}'] == '.WindowsService1')]

语法说明

  • 遇到包含特殊字符、保留字的键名时,放弃@.键名的写法,改用@['完整键名']的格式访问属性,不需要额外转义键名内部的特殊字符,只需将完整键名作为字符串放在单引号内,包裹在方括号中即可。
  • 该写法兼容绝大多数主流JSONPath实现,包括Zabbix内置的JSONPath解析器、Jayway JSONPath、Goessner JSONPath等常见实现。

如果需要使用正则匹配,只需替换属性访问部分即可,示例:

$.[?(@['{#SERVICE.NAME}'] =~ '^\\.WindowsService1$')]

注:正则语法中.是匹配任意字符的元字符,如果要匹配键值里字面量的点号,需要加反斜杠转义。


内容的提问来源于stack exchange,提问作者Raul Chiarella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:36:22