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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:06:35