如何拆分多对象JSON并枚举展示服务器配置?
解决方案:将JSON配置转为可枚举项生成服务器卡片
1. 先明确适配的JSON结构(基于你的需求场景)
假设你的JSON文件结构如下(如果和实际有出入,只需对应调整C#模型即可):
{ "Windows": { "Entry": { "CPU": "2核", "RAM": "4GB", "Storage": "50GB", "Price": "$20/月" }, "Medium": { "CPU": "4核", "RAM": "8GB", "Storage": "100GB", "Price": "$40/月" }, "High": { "CPU": "8核", "RAM": "16GB", "Storage": "200GB", "Price": "$80/月" } }, "Linux": { "Entry": { "CPU": "2核", "RAM": "4GB", "Storage": "60GB", "Price": "$15/月" }, "Medium": { "CPU": "4核", "RAM": "8GB", "Storage": "120GB", "Price": "$30/月" }, "High": { "CPU": "8核", "RAM": "16GB", "Storage": "250GB", "Price": "$60/月" } } }
2. 定义C#模型(核心是用Dictionary接收档位,实现可枚举)
把操作系统下的档位改为Dictionary<string, ServerConfig>,这样JSON里的Entry/Medium/High会自动映射为字典的键值对,天然支持枚举:
// 单条服务器配置模型 public class ServerConfig { public string CPU { get; set; } public string RAM { get; set; } public string Storage { get; set; } public string Price { get; set; } } // 顶层配置模型 public class ServerPlans { public Dictionary<string, ServerConfig> Windows { get; set; } public Dictionary<string, ServerConfig> Linux { get; set; } }
3. 反序列化JSON并转换为卡片数据
读取JSON文件后反序列化,再把字典转成方便页面遍历的统一卡片模型集合:
using System.Text.Json; using System.Collections.Generic; // 读取JSON文件内容 string jsonPath = "server-configs.json"; string jsonContent = File.ReadAllText(jsonPath); // 反序列化(如果大小写不匹配,可开启忽略大小写) var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var serverPlans = JsonSerializer.Deserialize<ServerPlans>(jsonContent, options); // 定义卡片模型,整合系统类型、档位和配置 public class ServerCard { public string OsType { get; set; } // Windows/Linux public string Tier { get; set; } // Entry/Medium/High public ServerConfig Config { get; set; } } // 生成所有卡片数据 var serverCards = new List<ServerCard>(); // 遍历Windows档位 foreach (var tier in serverPlans.Windows) { serverCards.Add(new ServerCard { OsType = "Windows", Tier = tier.Key, Config = tier.Value }); } // 遍历Linux档位 foreach (var tier in serverPlans.Linux) { serverCards.Add(new ServerCard { OsType = "Linux", Tier = tier.Key, Config = tier.Value }); }
4. 页面生成卡片(以ASP.NET Razor为例)
直接遍历serverCards集合,循环渲染卡片:
<div class="server-cards-grid"> @foreach (var card in Model.ServerCards) { <div class="server-card"> <h2>@card.OsType - @card.Tier</h2> <div class="config-item"> <span class="label">CPU:</span> <span class="value">@card.Config.CPU</span> </div> <div class="config-item"> <span class="label">内存:</span> <span class="value">@card.Config.RAM</span> </div> <div class="config-item"> <span class="label">存储:</span> <span class="value">@card.Config.Storage</span> </div> <div class="price">@card.Config.Price</div> <button class="order-btn">立即订购</button> </div> } </div>
备选方案:如果不想修改原有模型(用反射枚举固定属性)
如果你已经有了固定Entry/Medium/High属性的模型,也可以用反射来枚举这些属性:
假设原有模型:
public class OsTierPlans { public ServerConfig Entry { get; set; } public ServerConfig Medium { get; set; } public ServerConfig High { get; set; } } public class ServerPlans { public OsTierPlans Windows { get; set; } public OsTierPlans Linux { get; set; } }
反射枚举代码:
var serverCards = new List<ServerCard>(); // 处理Windows var windowsProps = typeof(OsTierPlans).GetProperties(); foreach (var prop in windowsProps) { var config = (ServerConfig)prop.GetValue(serverPlans.Windows); serverCards.Add(new ServerCard { OsType = "Windows", Tier = prop.Name, Config = config }); } // 处理Linux同理 var linuxProps = typeof(OsTierPlans).GetProperties(); foreach (var prop in linuxProps) { var config = (ServerConfig)prop.GetValue(serverPlans.Linux); serverCards.Add(new ServerCard { OsType = "Linux", Tier = prop.Name, Config = config }); }
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

