C# 如何从现有对象数组中按规则筛选zone值生成新列表
C#实现JSON数组过滤提取字段方案
核心逻辑:遍历JSON数组元素,筛选出同时不包含maxTry和minTry字段的元素,提取其zone字段值组成新列表。
方案1:预定义实体类(推荐,性能更高、类型安全)
步骤1:定义匹配JSON结构的实体类
无关字段无需声明,可空类型用于判断字段是否存在:
// 数组元素实体类 public class ResultItem { public int? MaxTry { get; set; } public int? MinTry { get; set; } public string Zone { get; set; } } // JSON根节点实体类 public class RootObject { public List<ResultItem> Result { get; set; } }
步骤2:反序列化+过滤提取
using System.Text.Json; using System.Linq; // 替换为你的原始JSON字符串 string rawJson = @"{""result"": [ {""maxTry"": 17,""minTry"": 10,""details"": [{""firstName"": ""Sam""},{""firstName"": ""Julio""}],""aggr"": [""Abc""],""zone"": ""D3""}, {""aggr"": [""Abc""],""zone"": ""C3""}, {""aggr"": [""Abc""],""zone"": ""B2""}, {""aggr"": [""Abc""],""zone"": ""T1""} ]}"; // 反序列化配置:忽略属性名大小写匹配 var deserializeOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var root = JsonSerializer.Deserialize<RootObject>(rawJson, deserializeOptions); // 过滤得到目标列表 List<string> targetList = root.Result .Where(item => item.MaxTry == null && item.MinTry == null) .Select(item => item.Zone) .ToList(); // 验证输出 Console.WriteLine(JsonSerializer.Serialize(targetList));
运行后输出结果为["C3","B2","T1"],符合预期。
方案2:无实体类动态解析(适合临时处理JSON的场景)
如果不需要复用结构,可直接用JsonNode动态解析节点,无需预定义类:
using System.Text.Json; using System.Linq; string rawJson = @"{""result"": [ {""maxTry"": 17,""minTry"": 10,""details"": [{""firstName"": ""Sam""},{""firstName"": ""Julio""}],""aggr"": [""Abc""],""zone"": ""D3""}, {""aggr"": [""Abc""],""zone"": ""C3""}, {""aggr"": [""Abc""],""zone"": ""B2""}, {""aggr"": [""Abc""],""zone"": ""T1""} ]}"; JsonArray resultArray = JsonNode.Parse(rawJson)["result"].AsArray(); // TryGetPropertyValue可严格判断字段是否真实存在,区分「字段不存在」和「字段存在但值为null」 List<string> targetList = resultArray .Where(item => !item.AsObject().TryGetPropertyValue("maxTry", out _) == false && !item.AsObject().TryGetPropertyValue("minTry", out _) == false) .Select(item => item["zone"].ToString()) .ToList();
内容的提问来源于stack exchange,提问作者xtc
相关产品推荐
相关产品推荐

