如何用C#遍历JSON查找指定ID对应的name值?
处理嵌套JSON并查找指定ID对应的Name值
你的JSON结构是嵌套的二维数组,result字段对应一个外层数组,里面的唯一元素又是包含目标对象的内层数组。以下是两种处理方式:
基于你现有代码的后续操作
在你当前的循环中,subtoks里的第一个元素就是包含三个对象的内层数组,你可以遍历这个数组中的每个对象,判断id是否为002:
var jObj = JObject.Parse(myJson).Children(); List<JToken> toks = jObj.Children().ToList(); foreach(JToken tok in toks) { List<JToken> subtoks = tok.Children().ToList(); // 取出内层数组(subtoks[0]就是包含目标对象的数组) JToken innerArrayToken = subtoks[0]; foreach(JToken itemToken in innerArrayToken.Children()) { // 将JToken转为JObject,方便访问属性 JObject itemObj = itemToken as JObject; if(itemObj == null) continue; // 检查id是否为002 string itemId = itemObj["id"]?.ToString(); if(itemId == "002") { // 获取对应的name值 string targetName = itemObj["name"]?.ToString(); // 这里可以根据需求返回或输出targetName Console.WriteLine(targetName); // 找到目标后可跳出循环,提升效率 break; } } }
更简洁的优化写法
不需要逐层遍历Children,直接通过键名和索引定位到内层数组,再用LINQ快速查找目标:
// 解析JSON字符串为JObject var jObj = JObject.Parse(myJson); // 定位到内层数组:先取result字段,再取外层数组的第一个元素(内层数组) JArray innerArray = jObj["result"]?[0] as JArray; if(innerArray != null) { // 用LINQ查找第一个id为002的对象 JToken targetItem = innerArray.FirstOrDefault(item => item["id"]?.ToString() == "002"); if(targetItem != null) { string targetName = targetItem["name"]?.ToString(); // 输出或返回目标name值 Console.WriteLine(targetName); } }
额外建议
如果需要多次处理这类JSON,建议定义对应的实体类进行反序列化,代码可读性和维护性会更好:
// 定义实体类 public class Item { public string id { get; set; } public string name { get; set; } } public class Root { public List<List<Item>> result { get; set; } } // 反序列化并查找目标 var root = JsonConvert.DeserializeObject<Root>(myJson); var targetName = root.result[0].FirstOrDefault(item => item.id == "002")?.name;
内容的提问来源于stack exchange,提问作者Andrew Andrew
相关产品推荐
相关产品推荐

