如何从JToken中筛选指定条件的Id字段存入List集合?
从JToken中筛选指定条件的Id存入列表的解决方案
问题原因
你当前的代码执行后返回所有Id,通常由以下两个常见问题导致:
- 调用
FindAll的节点错误:你没有指定在MySwitchInfo对应的数组节点下筛选,而是在JSON根节点直接调用筛选方法,会匹配到所有符合条件的子节点 - 字段值读取方式不稳定:直接用
ToString()获取on字段的值,如果JSON解析时该字段被识别为整型、布尔型等非字符串类型,ToString()的返回结果会和预期的"0"/"1"字符串不符,导致判断条件全部失效
正确实现方案
首先需要先定位到MySwitchInfo对应的JArray节点,再执行筛选,推荐使用更稳定的强类型取值方法Value<T>()读取字段值:
写法1:LINQ链式写法(更简洁)
// 先将你的JSON字符串解析为JObject对象 JObject root = JObject.Parse(你的JSON字符串); List<string> idList = ((JArray)root["MySwitchInfo"]) .Where(item => item.Value<string>("on") == "0") .Select(item => item.Value<string>("Id")) .ToList();
写法2:兼容你原有FindAll+ForEach的写法
JObject root = JObject.Parse(你的JSON字符串); List<string> idList = new List<string>(); ((JArray)root["MySwitchInfo"]).ToList() .FindAll(f => f.Value<string>("on") == "0") .ForEach(g => idList.Add(g.Value<string>("Id")));
额外优化建议
如果你的JSON中on字段的值可能存在前后空格,可以在判断时加Trim()避免匹配失败:
.Where(item => item.Value<string>("on").Trim() == "0")
以上代码依赖Newtonsoft.Json库,使用前需要引入using Newtonsoft.Json.Linq;命名空间
内容的提问来源于stack exchange,提问作者joetex72
相关产品推荐
相关产品推荐

