JsonConvert序列化后Linq分组键丢失问题咨询
解决LINQ分组后JsonConvert序列化丢失分组键的问题
我之前也踩过这个坑!其实问题出在IGrouping<TKey, TElement>的本质上——它继承自IEnumerable<TElement>,Json.NET(也就是你用的JsonConvert)默认只会把它当成一个集合来序列化,只会输出组里的元素,不会自动把Key属性包含进去。
解决方案:把分组结果转换成包含键和元素的结构
你只需要在分组后,用Select把每个IGrouping转换成一个明确包含分组键和组内元素的对象就行,比如用匿名类型或者自定义DTO类:
方法1:使用匿名类型(快速简单)
修改你的分组代码,在GroupBy之后加上Select:
var groupedData = statsList .GroupBy(s => s.LoggedDate.Date.ToString("yyyy-MM-dd")) .Select(g => new { LoggedDate = g.Key, // 这里就是你的分组日期键 Stats = g.ToList() // 组内的StatsVm对象列表 }) .ToList();
这样序列化后,你就能得到包含分组键的JSON结构了,类似这样:
[ { "LoggedDate": "2018-02-19", "Stats": [/* 5个StatsVm实例 */] }, { "LoggedDate": "2018-02-20", "Stats": [/* 5个StatsVm实例 */] } ]
方法2:使用自定义DTO类(适合复用场景)
如果这个分组结构需要在多个地方使用,建议创建一个专门的类:
public class DateGroupedStats { public string LoggedDate { get; set; } public List<StatsVm> Stats { get; set; } }
然后分组时转换成这个类:
var groupedData = statsList .GroupBy(s => s.LoggedDate.Date.ToString("yyyy-MM-dd")) .Select(g => new DateGroupedStats { LoggedDate = g.Key, Stats = g.ToList() }) .ToList();
这样序列化后的结构和匿名类型的效果一致,但代码更清晰,也方便后续维护。
为什么原来的方式不行?
因为IGrouping的Key属性是它的额外属性,不是枚举集合的一部分。Json.NET默认处理枚举类型时,只会遍历输出元素,不会主动去序列化它的其他属性。通过转换成普通对象,我们就把Key变成了对象的一个普通属性,自然就能被序列化出来了。
内容的提问来源于stack exchange,提问作者chobo2
相关产品推荐
相关产品推荐

