在C#中解析非数组结构JSON的最佳实现方案咨询
在C#中解析非数组结构JSON的最佳实现方案咨询
嘿,我来帮你搞定这个JSON解析的问题!你拿到的这个JSON结构比较特殊——services下面是嵌套的键值对对象,不是常规的数组,所以得用适配这种动态键的方式来处理,下面给你两种在C#里最常用的靠谱方案:
方案一:用.NET自带的System.Text.Json(无需额外安装包)
这种方案适合用.NET Core 3.0+或者.NET 5+的项目,不用装第三方库,直接用官方提供的序列化工具就行。我们可以通过字典类型来接收那些动态的键(比如Homecall、Two Day这些):
首先定义对应的实体类:
// 用来接收每个服务的ID public class ServiceItem { public string Id { get; set; } } // 最外层的容器类,用字典来接收services下的动态分类(比如这里的Home) public class ServicesContainer { public Dictionary<string, Dictionary<string, ServiceItem>> Services { get; set; } }
然后编写解析代码:
// 你的原始JSON字符串 string json = @"{""services"":{""Home"":{""Homecall"":{""id"":""10""},""Two Day"":{""id"":""11""},""Three Day"":{""id"":""12""}}}}"; // 反序列化JSON到我们定义的类里 var parsedResult = JsonSerializer.Deserialize<ServicesContainer>(json); // 提取Home这个分类以及下面的所有服务 if (parsedResult.Services.TryGetValue("Home", out var homeServices)) { // 这里的homeCategory就是你要的独立变量啦 string homeCategory = "Home"; Console.WriteLine($"分类名称:{homeCategory}"); // 遍历Home下的每个服务,输出名称和ID foreach (var (serviceName, serviceDetails) in homeServices) { Console.WriteLine($"服务:{serviceName},ID:{serviceDetails.Id}"); } }
方案二:用Newtonsoft.Json(Json.NET,经典第三方库)
如果你的项目还在使用.NET Framework,或者习惯用Json.NET,那可以用这种更灵活的动态解析方式,甚至不用提前定义实体类:
// 你的原始JSON字符串 string json = @"{""services"":{""Home"":{""Homecall"":{""id"":""10""},""Two Day"":{""id"":""11""},""Three Day"":{""id"":""12""}}}}"; // 直接解析成JObject动态对象 JObject jsonObj = JObject.Parse(json); // 获取Home对应的节点 JToken homeNode = jsonObj["services"]["Home"]; string homeCategory = "Home"; Console.WriteLine($"分类名称:{homeCategory}"); // 遍历Home下的所有服务属性 foreach (JProperty serviceProp in homeNode.Children<JProperty>()) { string serviceName = serviceProp.Name; string serviceId = serviceProp.Value["id"].ToString(); Console.WriteLine($"服务:{serviceName},ID:{serviceId}"); }
小提示
如果你的JSON里除了Home还可能有其他分类(比如Office、Shop),用字典的方式会自动适配所有分类,不用修改代码;如果结构完全固定,也可以把Home定义成类的固定属性,但显然你需要动态获取这些键,所以字典是最适合的选择。
备注:内容来源于stack exchange,提问作者PMG
相关产品推荐
相关产品推荐

