根据ID参数获取JSON中LastModifiedDate字段的实现方案
问题
给定如下JSON数据及对应的C#实体类,需实现GetLatestModifiedData方法,传入ID参数后返回对应的LastModifiedDate字段值。示例:传入"101"返回"2022-04-04T17:30:15.8609796Z",传入"102"返回"2018-05-05T16:36:41.1106642Z"。
JSON数据
{ "ProductImportData": { "ProductsToImport": [{ "ImportMode": "Update", "DateInfo": { "LastModifiedDate": "2022-04-04T17:30:15.8609796Z" }, "Values": [{ "Name": "ID", "ValuesByLocale": { "en-US": "101" } }] }, { "ImportMode": "Update", "DateInfo": { "LastModifiedDate": "2018-05-05T16:36:41.1106642Z" }, "Values": [{ "Name": "ID", "ValuesByLocale": { "en-US": "102" } }] } ] } }
C#实体类
using Newtonsoft.Json; using System.Collections.Generic; using System; public class DateInfo { public DateTime LastModifiedDate { get; set; } } public class ProductImportData { public List<ProductsToImport> ProductsToImport { get; set; } } public class ProductsToImport { public string ImportMode { get; set; } public DateInfo DateInfo { get; set; } public List<Value> Values { get; set; } } public class Root { public ProductImportData ProductImportData { get; set; } } public class Value { public string Name { get; set; } public ValuesByLocale ValuesByLocale { get; set; } } public class ValuesByLocale { [JsonProperty("en-US")] public string EnUS { get; set; } }
解决方案
步骤1:反序列化JSON到实体类
先将JSON字符串反序列化为Root类型对象,这里依赖Newtonsoft.Json(Json.NET)库,确保项目已安装该NuGet包。
// 假设jsonString为你的JSON数据字符串 Root rootObject = JsonConvert.DeserializeObject<Root>(jsonString);
步骤2:实现GetLatestModifiedData方法
遍历ProductsToImport集合,定位到Values中名称为"ID"且EnUS值匹配传入参数的项,返回其DateInfo.LastModifiedDate。加入空值检查和未找到的处理逻辑。
public DateTime? GetLatestModifiedData(Root rootObject, string targetId) { // 空值校验 if (rootObject?.ProductImportData?.ProductsToImport == null) return null; // 查找匹配的产品项 var matchingProduct = rootObject.ProductImportData.ProductsToImport .FirstOrDefault(product => product.Values?.FirstOrDefault(v => v.Name == "ID")?.ValuesByLocale?.EnUS == targetId); // 返回对应日期,未找到则返回null return matchingProduct?.DateInfo?.LastModifiedDate; }
调用示例
// 假设已完成反序列化得到rootObject string targetId = "101"; DateTime? resultDate = GetLatestModifiedData(rootObject, targetId); if (resultDate.HasValue) { // 格式化输出为示例中的ISO 8601格式 Console.WriteLine(resultDate.Value.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ")); } else { Console.WriteLine("未找到匹配的ID"); }
优化建议(高频查询场景)
如果需要频繁根据ID查询,建议提前将数据转换为字典,提升查询效率:
var idToDateMap = rootObject.ProductImportData.ProductsToImport .Where(p => p.Values?.Any(v => v.Name == "ID") == true) .ToDictionary( p => p.Values.First(v => v.Name == "ID").ValuesByLocale.EnUS, p => p.DateInfo.LastModifiedDate ); // 查询时直接使用字典 if (idToDateMap.TryGetValue("101", out DateTime date)) { Console.WriteLine(date.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ")); }
内容的提问来源于stack exchange,提问作者Edwin
相关产品推荐
相关产品推荐

