如何使用LINQ从键不固定的JSON中提取符合条件的rackD系列键值对
解决方案
你提到的JsonContent["serviceMap"][rackD1*]这种通配符方式无法直接实现,因为JSON对象的键访问不支持通配符匹配,必须结合LINQ和正则/字符串判断来筛选目标键值。
以下是两种常用.NET JSON库的实现方案:
方案一:使用Newtonsoft.Json(Json.NET)
这是.NET生态中广泛使用的JSON处理库,结合LINQ可以快速筛选目标数据:
using Newtonsoft.Json.Linq; using System.Text.RegularExpressions; // 假设jsonString是你的JSON文本内容 JObject jsonObj = JObject.Parse(jsonString); JObject serviceMap = jsonObj["ServiceMap"].ToObject<JObject>(); // 筛选符合条件的rack键名 var targetRackKeys = serviceMap.Properties() .Where(prop => // 匹配以rackD开头、后跟数字的键名 Regex.IsMatch(prop.Name, @"^rackD\d+$") && // 提取数字并验证范围在1-1000之间 int.TryParse(prop.Name.Substring(5), out int rackNum) && rackNum >= 1 && rackNum <= 1000 && // 验证Center字段为south(可根据需求选择是否忽略大小写) string.Equals(prop.Value["Center"]?.ToString(), "south", StringComparison.OrdinalIgnoreCase) ) .Select(prop => prop.Name) // 如果需要键值对,替换为.Select(prop => new { Key = prop.Name, Data = prop.Value }) .ToList();
方案二:使用System.Text.Json(.NET Core/.NET 5+内置)
如果你使用的是较新的.NET版本,推荐使用内置的System.Text.Json:
using System.Text.Json; using System.Text.RegularExpressions; // 解析JSON文档 using JsonDocument doc = JsonDocument.Parse(jsonString); JsonElement serviceMap = doc.RootElement.GetProperty("ServiceMap"); List<string> targetRackKeys = new(); // 遍历所有ServiceMap下的属性 foreach (JsonProperty prop in serviceMap.EnumerateObject()) { // 验证键名格式和数字范围 if (Regex.IsMatch(prop.Name, @"^rackD\d+$") && int.TryParse(prop.Name.Substring(5), out int rackNum) && rackNum is >=1 and <=1000) { // 检查Center字段是否存在并匹配south if (prop.Value.TryGetProperty("Center", out JsonElement centerElem)) { string centerVal = centerElem.GetString(); if (string.Equals(centerVal, "south", StringComparison.OrdinalIgnoreCase)) { targetRackKeys.Add(prop.Name); } } } }
关键说明
- 通配符限制:JSON对象本身不支持
rackD1*这类通配符查询,必须通过遍历所有属性并添加筛选条件来实现。 - 大小写匹配:如果需要忽略大小写(比如匹配"South"或"SOUTH"),保留
StringComparison.OrdinalIgnoreCase;如果需要精确匹配,直接用==即可。 - 数字范围验证:通过正则确保键名是
rackD加数字,再用int.TryParse提取数字并验证是否在1-1000区间内。
内容的提问来源于stack exchange,提问作者Sravani
相关产品推荐
相关产品推荐

