序列化时重复客户ID未合并历史记录,请求验证模型正确性
问题:客户ID大小写差异导致序列化后生成重复父节点,需合并对应历史记录
我现在碰到个棘手的小问题:手里有一批包含客户ID和对应历史记录的数据列表,我把它映射到Customer模型后放进CustomerList里,结果序列化输出时,同一客户ID(比如liebaj7337和LieBaj7337)居然生成了多个父节点。我想要的是同一客户ID(不区分大小写)下合并所有History记录,麻烦帮忙看看我的模型是否符合预期,或者该怎么调整才能达到目标?
当前序列化输出
[ { "INI_CUSTOMER_ID": "liebaj7337", "History": [ { "DealerID": "1", "VisitedStoreName": "1", "VisitedDate": "1", "Activity": "1", "VehicleID": "1", "VehicleName": "1", "OCN": "", "Source": "1" } ] }, { "INI_CUSTOMER_ID": "LieBaj7337", "History": [ { "DealerID": "2", "VisitedStoreName": "2", "VisitedDate": "2", "Activity": "2", "VehicleID": "2", "VehicleName": "2", "OCN": "", "Source": "2" } ] } ]
预期输出
[ { "INI_CUSTOMER_ID": "liebaj7337", "History": [ { "DealerID": "1", "VisitedStoreName": "1", "VisitedDate": "1", "Activity": "1", "VehicleID": "1", "VehicleName": "1", "OCN": "", "Source": "1" }, { "DealerID": "2", "VisitedStoreName": "2", "VisitedDate": "2", "Activity": "2", "VehicleID": "2", "VehicleName": "2", "OCN": "", "Source": "2" } ] } ]
我当前使用的模型代码
public class CustomerList { public List<Customer> Customers { get; set; } } public class Customer { public string INI_CUSTOMER_ID { get; set; } public List<History> History { get; set; } } public class History { public string DealerID { get; set; } public string VisitedStoreName { get; set; } public string VisitedDate { get; set; } public string Activity { get; set; } public string VehicleID { get; set; } public string VehicleName { get; set; } public string OCN { get; set; } public string Source { get; set; } }
问题分析与解决方案
首先得说:你的模型结构本身是完全符合预期输出的!问题出在客户ID的大小写处理和数据合并逻辑上——因为C#里字符串默认是区分大小写的,所以liebaj7337和LieBaj7337会被当成两个不同的客户ID,自然生成两个父节点。
要实现预期效果,你需要在把原始数据映射到模型之前,先做两步处理:
- 统一客户ID的大小写(比如全部转小写或大写)
- 按统一后的ID分组,把同一客户的History记录合并到一个
Customer对象中
这里给你一段用LINQ处理的示例代码,假设你的原始数据是一个包含客户ID和单条History的集合:
// 假设rawData是你的原始数据集合,格式为List<(string CustomerId, History HistoryRecord)> var mergedCustomers = rawData // 按统一小写后的客户ID分组 .GroupBy(item => item.CustomerId.ToLowerInvariant()) // 把每组的History合并到一个Customer对象里 .Select(group => new Customer { INI_CUSTOMER_ID = group.Key, // 用统一后的小写ID History = group.Select(item => item.HistoryRecord).ToList() }) .ToList(); // 最后赋值给CustomerList var customerList = new CustomerList { Customers = mergedCustomers };
这样处理之后,再序列化customerList,就能得到你想要的同一客户ID下合并所有History的结果了。
内容的提问来源于stack exchange,提问作者Aldrin B.
相关产品推荐
相关产品推荐

