如何将指定JSON转换为以Date为键的C#字典类?在线工具转换结果不符
把你的POSTMAN JSON转换成符合需求的C#类
没问题,我来帮你搞定这个转换!你的JSON结构是日期字符串作为键,对应的值是一组包含时长、起止时间的时间段数组,完全可以通过「自定义实体类+字典」的组合来完美匹配,以下是具体实现步骤:
1. 先创建表示单个时间段的实体类
这个类对应JSON里每个独立的时间段对象,属性名要和JSON中的键保持一致(如果用默认序列化规则的话,大小写也得匹配,不过后续可以通过配置忽略大小写):
public class TimeEntry { public int Duration { get; set; } public string End { get; set; } public string Start { get; set; } }
2. 用字典来映射日期和时间段数组
你的需求是「以Date为键、其他属性为值的字典」,这里的Date是JSON里的日期字符串,所以直接用Dictionary<string, List<TimeEntry>>就可以完美对应整个JSON结构:
反序列化示例(常用两种序列化库)
用Newtonsoft.Json(Json.NET,最常用的第三方库)
如果你项目里用的是Json.NET,反序列化代码很简单:
using Newtonsoft.Json; // 假设你的JSON内容已经存在jsonString变量中 var dateToTimeEntries = JsonConvert.DeserializeObject<Dictionary<string, List<TimeEntry>>>(jsonString);
用System.Text.Json(.NET Core 3.0+自带,无需额外安装)
如果用的是.NET自带的序列化库,可以这样写,还能配置忽略大小写(避免因为JSON键大小写和类属性不一致出问题):
using System.Text.Json; var serializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var dateToTimeEntries = JsonSerializer.Deserialize<Dictionary<string, List<TimeEntry>>>(jsonString, serializerOptions);
进阶:把字典键转换成DateTime类型
如果不想用字符串作为键,希望直接用DateTime类型,可以做一点小处理:
方案1(Json.NET直接支持)
var jsonSettings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.DateTime, DateTimeZoneHandling = DateTimeZoneHandling.Local // 根据你的时区需求调整,比如Utc }; var dateToTimeEntries = JsonConvert.DeserializeObject<Dictionary<DateTime, List<TimeEntry>>>(jsonString, jsonSettings);
方案2(System.Text.Json转换)
因为System.Text.Json默认不支持DateTime作为字典键,所以可以先反序列化成字符串键的字典,再转成DateTime键:
var stringKeyDict = JsonSerializer.Deserialize<Dictionary<string, List<TimeEntry>>>(jsonString, serializerOptions); var dateKeyDict = stringKeyDict.ToDictionary( kvp => DateTime.Parse(kvp.Key), kvp => kvp.Value );
这样处理后,你就可以通过dateToTimeEntries["2020-08-27"]或者dateKeyDict[new DateTime(2020,8,27)]直接获取对应日期的所有时间段了,完全符合你的需求!
内容的提问来源于stack exchange,提问作者blazk
相关产品推荐
相关产品推荐

