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

使用Select()从满足条件的JSON列表中获取CustomerId值

问题

我有一个JSON数组,需要从中获取存在CustomerId属性的节点对应的CustomerId值。目前通过foreach循环遍历categories,跳过属性树中无CustomerId的节点,代码可正常运行,但希望改用更简洁易读的Select方法替代foreach实现相同逻辑。

现有代码:

var customerId = "";
foreach (var category in JObject.Parse(someData)?["categories"])
{
    var val = category?["sections"].FirstOrDefault()
        ?["areas"]?.FirstOrDefault()
        ?["components"]? // 注意:示例JSON中此处拼写为componenets,需保持一致
        ?["variables"]?.FirstOrDefault()
        ?["properties"]
        ?["customerId"]?.ToString();

    if (val == null)
        continue;
    else
    {
        customerId = val;
        break;
    }
}

示例JSON数据:

{
  "categories": [
    {
      "identifier": "cat1",
      "sections": [
        {
          "identifier": "030615e9-67f9-43ca-a06e-194e7afadccb",
          "properties": {},
          "areas": [
            {
              "identifier": "1206f27b-d354-4bfa-9b5e-1fe6b4f7cc83",
              "componenets": [
                {
                  "identifier": "49e4550f-8001-4d32-b796-a7ad4423e118",
                  "type": "Product",
                  "variables": [
                    {
                      "identifier": "0d260417-fa6d-492b-85f1-dc2565bc4805",
                      "properties": {
                        "description": ""
                      }
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "identifier": "cat2",
      "sections": [
        {
          "identifier": "00b5bfa6-f482-47c2-bdd7-aaac273b7772",
          "properties": {},
          "areas": [
            {
              "identifier": "1ca9d051-5ec0-45af-84bc-561cd7620efa",
              "componenets": [
                {
                  "identifier": "c73b1e52-3acd-4020-8fc5-adfef7d633b4",
                  "type": "Customer",
                  "variables": [
                    {
                      "identifier": "0064e872-5c7f-4ec7-a2d6-e8b35b94bd1d",
                      "properties": {
                        "customerId": { "Text":"MainId", "Value":"A12123" }
                      }
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
解决方案

用Linq的链式调用可以替代foreach循环,实现更简洁的逻辑,代码如下:

var customerId = JObject.Parse(someData)?["categories"]
    .Select(category => 
        category?["sections"].FirstOrDefault()
            ?["areas"]?.FirstOrDefault()
            ?["componenets"]? // 注意:示例JSON中字段拼写为componenets,需和原数据保持一致
            ?["variables"]?.FirstOrDefault()
            ?["properties"]
            ?["customerId"]?.ToString())
    .FirstOrDefault(val => val is not null) ?? string.Empty;

逻辑说明

  • Select遍历每个category,按原路径尝试提取customerId的字符串表示,不存在则返回null
  • FirstOrDefault(val => val is not null)直接取第一个非空结果,对应原循环中找到值就break的逻辑
  • 最后用?? string.Empty保证没有找到值时返回空字符串,和原代码行为完全一致

另外注意原代码中components的拼写和示例JSON里的componenets不一致,必须统一拼写才能正确定位到字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:01:43