You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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);
            }
        }
    }
}

关键说明

  1. 通配符限制:JSON对象本身不支持rackD1*这类通配符查询,必须通过遍历所有属性并添加筛选条件来实现。
  2. 大小写匹配:如果需要忽略大小写(比如匹配"South"或"SOUTH"),保留StringComparison.OrdinalIgnoreCase;如果需要精确匹配,直接用==即可。
  3. 数字范围验证:通过正则确保键名是rackD加数字,再用int.TryParse提取数字并验证是否在1-1000区间内。

内容的提问来源于stack exchange,提问作者Sravani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:50:26