如何使用Newtonsoft.Json SelectToken方法获取JSON数组最后一项
解决方案:用Newtonsoft.Json的SelectToken获取数组最后一项
Newtonsoft.Json原生的SelectToken路径语法不支持[-1]或[^1]这类负索引写法,不过有两种可行方案满足你的需求:
方案一:使用表达式路径(无需修改后端代码)
利用SelectToken支持的表达式语法,通过@引用当前数组节点,结合length属性计算最后一项索引。前端直接输入这种路径即可:
var jsonArray = @"[{""Name"":""amir0"",""Id"":0},{""Name"":""amir1"",""Id"":1}]"; var array = JArray.Parse(jsonArray); // 通过表达式计算最后一项的索引 Console.WriteLine(array.SelectToken("[(@.length-1)].Name")); // 输出:amir1
原理
@代表当前遍历的数组节点@.length获取数组的元素总数(@.length-1)就是最后一项的合法正索引,直接嵌入路径即可被SelectToken解析执行
方案二:自定义扩展方法支持负索引(适配[-1]写法)
如果前端必须使用[-1]这类负索引语法,可以写一个扩展方法重写路径解析逻辑,自动将负索引转换为合法的正索引:
public static class JTokenExtensions { public static JToken SelectTokenWithNegativeIndex(this JToken token, string path) { var jPath = new JPath(path); var current = token; foreach (var segment in jPath.Segments) { if (segment is JIndex indexSeg) { var index = indexSeg.Index; // 处理负索引 if (index < 0 && current is JArray array) { index = array.Count + index; if (index < 0) throw new ArgumentOutOfRangeException(nameof(path), "索引超出范围"); current = array[index]; } else { current = current.SelectToken(segment.ToString()); } } else { current = current.SelectToken(segment.ToString()); } if (current == null) break; } return current; } } // 使用示例 Console.WriteLine(array.SelectTokenWithNegativeIndex("[-1].Name")); // 输出:amir1
这个方法会遍历路径的每一段,遇到负索引时自动根据数组长度转换为正索引,完全兼容前端输入的[-1]格式。
内容的提问来源于stack exchange,提问作者AmirHosseinMp02
相关产品推荐
相关产品推荐

