如何编写JMESPath表达式选择含括号的字典键?
解决JMESPath匹配含特殊字符键的问题
你的问题出在键名包含()、{}这类JMESPath语法中的特殊字符,直接写会被解析器误判成语法结构,导致报错。修正方法很简单:用方括号包裹键名,同时给键名加上双引号,让JMESPath把它当作普通字符串键处理。
正确的JMESPath表达式
["restrictions({\"basketItems\":[],\"endDateTime\":\"\",\"startDateTime\":\"\"})"]
在Python中使用示例
如果用Python的jmespath库,可以这样写(两种方式都可行):
import jmespath product_data = { 'restrictions({"basketItems":[],"endDateTime":"","startDateTime":""})': [ {'__typename': 'ProductRestrictionType', 'type': 'RdgDateRange', 'isViolated': False, 'message': 'Price Cuts - Was £0.50\n'}, {'__typename': 'ProductRestrictionType', 'type': 'ExcludedProduct', 'isViolated': True, 'message': 'This product is unavailable'} ] } # 方式1:表达式用单引号包裹,内部双引号无需转义 result1 = jmespath.search('["restrictions({"basketItems":[],"endDateTime":"","startDateTime":""})"]', product_data) # 方式2:表达式用双引号包裹,内部双引号转义 result2 = jmespath.search("[\"restrictions({\\\"basketItems\\\":[],\\\"endDateTime\\\":\\\"\\\",\\\"startDateTime\\\":\\\"\\\"})\"]", product_data) print(result1) # 输出对应的值列表
原理说明
JMESPath的点语法(如obj.key)只适用于符合标识符规则的键名(不含特殊字符、空格,不以数字开头)。当键名包含特殊字符时,必须切换到方括号索引语法,并用引号明确标记这是一个字符串键,避免解析器混淆语法元素和键名本身。
内容的提问来源于stack exchange,提问作者yasirnazir
相关产品推荐
相关产品推荐

