C#使用NReJSON操作Redis时JSONPATH length属性报错求助
错误原因
你写的JSONPath.[(@.length)]存在两个语法和逻辑层面的错误,直接导致Redis解析路径失败:
(@.xxx)是JSONPath的元素过滤器语法,作用是从数组中筛选出符合括号内条件的元素,不能用来动态计算数组长度、也不能直接作为数组下标使用。你把过滤器表达式直接放在下标位,RedisJSON引擎无法识别这种非法语法,直接抛出路径解析错误。JsonSet方法传入的path参数必须是可直接定位到具体节点的静态路径,不支持在路径字符串内部嵌入动态计算表达式,就算length语法写对,也无法在路径解析阶段动态拿到数组长度值。- 额外逻辑误区:就算你修正过滤器语法,
@.length取的是当前遍历元素的length属性,你存储的数组元素是Data类型,本身不存在length属性,根本拿不到你想要的数组总长度。
解决方案
根据你的业务场景(往存储的数组里插入新元素),优先选下面两种实现方式:
方案1:直接使用数组追加命令(推荐,无需手动计算下标)
不需要自己算数组长度,直接调用NReJSON封装的数组追加方法,就能把元素插到数组尾部,性能更高也不会出现路径错误:
// 先序列化要插入的单个Data对象,不要序列化整个列表 var serializedItem = JsonConvert.SerializeObject(data); // RedisJSON 2.x及以上版本用根路径"$",1.x老版本把路径改成"."即可 _database.JsonArrAppend(redisKey, "$", serializedItem);
注意:插入单个元素时不需要把新元素包装成列表序列化,
JsonArrAppend会自动把传入的JSON值追加到目标数组末尾。
方案2:先取数组长度再拼接静态路径(适合需要指定插入位置的场景)
如果你确实需要拿到数组长度做自定义插入逻辑,先单独调用数组长度查询方法拿到具体值,在C#侧拼接成合法的静态路径后再执行Set操作:
// 查询根路径下数组的当前长度 var arrayLength = _database.JsonArrLength(redisKey, "$"); // 拼接成合法的下标路径,比如当前长度是3就会生成"$[3]",对应数组尾部位置 var insertPath = $"$[{arrayLength}]"; var serializedItem = JsonConvert.SerializeObject(data); _database.JsonSet(redisKey, serializedItem, insertPath);
内容的提问来源于stack exchange,提问作者csharpnewbie programmer
相关产品推荐
相关产品推荐

