如何扁平化含数组属性的JObject?优化酒店房间详情提取代码
优化JSON酒店房间详情提取的实现方案
需求说明
给定如下JSON结构:
{ "Id": "12345", "Clubs": {}, "Hotel": { "OneStar": [ { "id": "1-0", "SomeProperty": "blah" }, { "id": "1-1", "SomeProperty": "blahX" } ], "TwoStar": [ { "id": "2-0", "SomeProperty": "" } ], "ThreeStar": [] } }
需要提取Hotel下所有星级分类中的房间详情,整理为字符串列表。
优化实现
原代码使用三层嵌套foreach实现,可通过Linq的扁平化操作简化代码,提升可读性和优雅度:
using Newtonsoft.Json.Linq; // 解析JSON字符串 var jsonObj = JObject.Parse(jsonString); // 扁平化提取所有房间详情字符串 var roomDetails = jsonObj["Hotel"]? .Children<JProperty>() // 获取Hotel下的所有星级属性(OneStar、TwoStar等) .SelectMany(prop => prop.Value.Children<JObject>()) // 合并所有星级数组中的房间对象 .Select(roomObj => roomObj.ToString()) // 将每个房间对象转为JSON字符串 .ToList(); return roomDetails;
代码说明
jsonObj["Hotel"]?.Children<JProperty>():安全获取Hotel节点下的所有子属性,避免空引用异常SelectMany:将多个数组(各星级的房间列表)中的元素扁平化合并为一个连续序列,替代嵌套循环Select(roomObj => roomObj.ToString()):将每个JObject类型的房间详情转为JSON格式字符串- 最终通过
ToList()得到目标List<string>
优势对比
相比原嵌套foreach写法,该实现:
- 代码更简洁,逻辑连贯易读
- 避免多层嵌套缩进,降低维护成本
- 性能与原写法相当,语法更符合现代C#风格
内容的提问来源于stack exchange,提问作者IBot
相关产品推荐
相关产品推荐

