使用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的字符串表示,不存在则返回nullFirstOrDefault(val => val is not null)直接取第一个非空结果,对应原循环中找到值就break的逻辑- 最后用
?? string.Empty保证没有找到值时返回空字符串,和原代码行为完全一致
另外注意原代码中components的拼写和示例JSON里的componenets不一致,必须统一拼写才能正确定位到字段。
内容的提问来源于stack exchange,提问作者Maya
相关产品推荐
相关产品推荐

