如何在C#中反序列化含动态日期键的API返回JSON?
解决方案
针对你遇到的动态日期键反序列化问题,有两种实用的处理方式,以下是具体代码示例:
方式1:直接反序列化为带Dictionary的POCO类
这种方式无需手动遍历节点,利用Dictionary<string, T>自动匹配动态键,是最简便的方案:
首先定义对应的数据模型:
using System.Collections.Generic; using System.Text.Json.Serialization; public class ApiResponse { [JsonPropertyName("found")] public bool Found { get; set; } [JsonPropertyName("resultsData")] public List<Dictionary<string, List<DailyInfo>>> ResultsData { get; set; } [JsonPropertyName("message")] public string Message { get; set; } } public class DailyInfo { [JsonPropertyName("info1")] public string Info1 { get; set; } [JsonPropertyName("infoCode")] public int InfoCode { get; set; } [JsonPropertyName("infos")] public List<InfoItem> Infos { get; set; } } public class InfoItem { [JsonPropertyName("code")] public int Code { get; set; } [JsonPropertyName("extraInfo1")] public string ExtraInfo1 { get; set; } [JsonPropertyName("extraInfo2")] public string ExtraInfo2 { get; set; } [JsonPropertyName("extraInfo3")] public string ExtraInfo3 { get; set; } [JsonPropertyName("order")] public int Order { get; set; } [JsonPropertyName("risk")] public string Risk { get; set; } [JsonPropertyName("alarm")] public string Alarm { get; set; } }
然后直接反序列化:
using System.Text.Json; string jsonString = "你的API返回JSON字符串"; var apiResponse = JsonSerializer.Deserialize<ApiResponse>(jsonString); // 遍历处理数据 foreach (var dateDict in apiResponse.ResultsData) { foreach (var kvp in dateDict) { string dateStr = kvp.Key; List<DailyInfo> dailyData = kvp.Value; // 这里可以将dateStr转为DateTime,或者直接使用字符串 // DateTime date = DateTime.Parse(dateStr); // 处理dailyData中的内容 } }
方式2:使用JsonNode手动遍历动态键
如果你已经在使用JsonNode处理,可以通过遍历对象属性来提取动态日期键:
using System.Text.Json; using System.Text.Json.Nodes; string jsonString = "你的API返回JSON字符串"; JsonNode rootNode = JsonNode.Parse(jsonString); // 获取resultsData数组 JsonArray resultsArray = rootNode["resultsData"].AsArray(); foreach (JsonNode itemNode in resultsArray) { JsonObject dateObject = itemNode.AsObject(); // 每个对象只有一个日期键值对,用Single()获取 var dateEntry = dateObject.Single(); string dateStr = dateEntry.Key; JsonArray dailyInfoArray = dateEntry.Value.AsArray(); // 将数组反序列化为DailyInfo列表 List<DailyInfo> dailyInfos = dailyInfoArray.Deserialize<List<DailyInfo>>(); // 后续处理dateStr和dailyInfos }
两种方式都能完美处理动态日期键的问题,推荐优先使用方式1,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者pinguinone
相关产品推荐
相关产品推荐

