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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:15:05