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

如何扁平化含数组属性的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:27:51