Redis调用JSON.SET新增对象键值对报wrong static path错误
错误触发原因
- 核心原因是路径不符合RedisJSON模块的静态路径校验规则:你在拼接路径时直接用
.连接带横杠-的UUID格式optionId,横杠会被路径解析器识别为减号操作符,不是键名的组成部分;加上你调用JSON.SET时传入了NX参数,该模式下RedisJSON强制要求路径是无表达式的明确静态路径,解析失败就会抛出wrong static path错误。 - 额外的层级错误:从你给出的JSON结构看,optionId对应的权重值应该存放在
weight.options空对象下,你当前拼接的路径是直接在weight节点下追加子键,就算路径语法校验通过,也会把键值对写到错误的层级。
修复方法
- 先修正路径基准层级,确保路径最终定位到
weight.options节点下。 - 对包含特殊字符(横杠、点、空格等)的键名,不要直接用
.拼接,改用['键名']的格式转义引用,让解析器把内容识别为完整键名,而非路径操作符。 - 调整Lua代码的路径拼接逻辑,参考实现如下:
local optionId = 'a161713a-1987-4974-acfc-dd0a56ad99e7' local weight = 20 -- 假设原weightPath是指向weight节点的路径(例如$.weight),追加.options定位到选项存储容器 -- 对optionId用方括号+单引号包裹做转义,避免特殊字符破坏路径解析 local targetPath = string.format("%s.options['%s']", weightPath, optionId) redis.call('JSON.SET', schemaKey, targetPath, weight, 'NX')
执行成功后,目标JSON结构会更新为:
"weight": { "options": { "a161713a-1987-4974-acfc-dd0a56ad99e7": 20 }, "value": 50 }
补充说明:只要键名不是纯字母、数字、下划线组成,在RedisJSON路径里引用都建议用
['键名']的格式转义,能规避绝大多数路径解析错误。
内容的提问来源于stack exchange,提问作者Mohammed Ehab
相关产品推荐
相关产品推荐

