DotNetCore跨平台~Json动态序列化属性
Json动态序列化属性,主要为了解决一个大实体,在返回前端时根据需要去序列化,如果实体里的某个属性在任务情况下都不序列化,可以添加[JsonIgnore]特性,这种是全局的过滤,但是更多的情况下我们需要的是,按着某种场景去序列化某些属性,下面举例说明。
两种场景,B2C场景和C2C场景,它们需要让PeopleDTO这个实体返回的内容不一样,前者返回Name和Email,而后者只返回Name,这时我们的JsonIgnore不能满足,所以需要从新开发一种新的模式。
笨方法:为不同的场景写不同的DTO实体,当然这会有很多重复的代码
大叔最新的Json动态序列化属性的方法
SerializationFilterAttribute,按着场景去实现这个特性,它是个基类
/// <summary> /// 序列化标识特性 /// </summary> [AttributeUsageAttribute(AttributeTargets.Property)] public abstract class SerializationFilterAttribute : Attribute { }
场景一,B2CAttribute,它需要序列化Name和Email这两个属性,所以在 DTO实体类里会标识上它
public class B2CAttribute : SerializationFilterAttribute { }
场景二,C2CAttribute,它只需要序列化Name这个属性
public class C2CAttribute : SerializationFilterAttribute { }
在实体上,我们为对应的属性添加这两个特性,让它在序列化时按需返回
public class PeopleDTO { [C2CAttribute, B2CAttribute] public FullNameDTO Name { get; set; } [B2CAttribute] public string Email { get; set; } public DateTime CreateTime { get; set; } }
改写我们之前的序列化方法,让它支持按需序列化
public static string SerializeToJson<T>(T obj, SerializationFilterAttribute filter) { dynamic d = new System.Dynamic.ExpandoObject(); foreach (var item in typeof(T).GetProperties()) { if (item.GetCustomAttributes(false).Contains(filter)) { (d as System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<string, object>>).Add(new System.Collections.Generic.KeyValuePair<string, object>(item.Name, item.GetValue(obj))); } } var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; return JsonConvert.SerializeObject(d); }
在程序的调用它也很简单,直接把对应的场景特性输入即可
PeopleDTO peopleDTO = new PeopleDTO { Name = new FullNameDTO { LastName = "zhanling", FirstName = "zhang", ChinaName = "张占岭" }, Email = "zhangsan@sina.com", CreateTime = DateTime.Now }; var msg1 = SerializationHelper.SerializeToJson(peopleDTO, new B2CAttribute());
返回的结果如下,只包含Name和Email
{ "Name":{ "LastName":"zhanling", "ChinaName":"张占岭" }, "Email":"zhangsan@sina.com" }
感谢各位的阅读!
有时,一种思维的转换可能会实现不同的效果!
合集:
DotNetCore
分类:
.Net Core
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2017-03-30 Lind.DDD.DynamicModules动态模块化的设计
2016-03-30 WebApi系列~安全校验中的防篡改和防复用
2015-03-30 知方可补不足~UPDLOCK更新锁的使用
2015-03-30 MongoDB学习笔记~环境搭建
2012-03-30 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~七 为DBContext对象应该作为其它实体操作类型的基类,并为它提供统一的提交动作