如何使用Newtonsoft Json提取JSON数组中全部ID并解决索引越界问题
解决JToken提取JSON数组所有id时索引越界的问题
问题原因排查
你遇到的索引越界问题,大概率是以下两种情况:
- 错误地将
JToken直接当作数组用索引访问,未先转换为JArray,导致实际可访问元素数量与预期不符 - 循环条件硬编码固定值(比如
i < 100),或获取数组长度的方式错误,导致循环范围超出实际集合大小
正确解决方案
方法1:使用foreach遍历(最稳妥)
直接遍历results数组所有元素,无需关心索引,彻底避免越界问题:
// 假设已加载JSON到JObject root JArray resultsArray = (JArray)root["cars"]["results"]; List<string> ids = new List<string>(); // 若id为数字类型,改用List<int> foreach (JToken car in resultsArray) { string id = car["id"].ToString(); ids.Add(id); } // 转换为目标数组 string[] idArray = ids.ToArray();
方法2:基于JArray的Count做循环条件
若坚持用for循环,必须以JArray的实际长度作为循环上限:
JArray resultsArray = (JArray)root["cars"]["results"]; List<string> ids = new List<string>(); for (int i = 0; i < resultsArray.Count; i++) { JToken car = resultsArray[i]; string id = car["id"].ToString(); ids.Add(id); } string[] idArray = ids.ToArray();
关键注意点
- 务必确保
root["cars"]["results"]是JArray类型,可先加类型判断避免转换报错:if (root["cars"]["results"] is JArray resultsArray) { // 执行遍历逻辑 } - 不要硬编码循环上限值(比如117),始终用集合的
Count属性动态获取长度,适配JSON数据的变化
内容的提问来源于stack exchange,提问作者icebuken
相关产品推荐
相关产品推荐

