博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DotNetCore跨平台~Json动态序列化属性
阅读量:6311 次
发布时间:2019-06-22

本文共 2211 字,大约阅读时间需要 7 分钟。

Json动态序列化属性,主要为了解决一个大实体,在返回前端时根据需要去序列化,如果实体里的某个属性在任务情况下都不序列化,可以添加[JsonIgnore]特性,这种是全局的过滤,但是更多的情况下我们需要的是,按着某种场景去序列化某些属性,下面举例说明。

两种场景,B2C场景和C2C场景,它们需要让PeopleDTO这个实体返回的内容不一样,前者返回Name和Email,而后者只返回Name,这时我们的JsonIgnore不能满足,所以需要从新开发一种新的模式。

笨方法:为不同的场景写不同的DTO实体,当然这会有很多重复的代码

大叔最新的Json动态序列化属性的方法

SerializationFilterAttribute,按着场景去实现这个特性,它是个基类

///     /// 序列化标识特性    ///     [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 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
>).Add(new System.Collections.Generic.KeyValuePair
(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"}

感谢各位的阅读!

有时,一种思维的转换可能会实现不同的效果!

转载地址:http://zahxa.baihongyu.com/

你可能感兴趣的文章
BinarySearch 二分查找
查看>>
vCloud Director Enterprise Cloud 5.5部署(七)
查看>>
原型、原型链、继承模式
查看>>
ServiceStack OrmLite 连接Sqlserver数据库
查看>>
好用的 sql 内置函数
查看>>
laravel数据库操作返回值 Eloquent
查看>>
有关WiFi SSID的获取
查看>>
JS常用的函数笔记
查看>>
0C中如何产生多个随机互不相同的数.
查看>>
KVM虚拟化平台的搭建及基本命令
查看>>
open***-2.1_rc20-install.exe 客户端安装与重新安装报错CreateProcess Failed解决
查看>>
C#学习基本概念之关键字--override
查看>>
《Linux云计算从入门到精通》系列实战笔记全放送
查看>>
ibatis模糊查询
查看>>
iPhone zip压缩与解压
查看>>
AlertDialog自定义效果
查看>>
我的友情链接
查看>>
本地消息表实现最终一致性
查看>>
SharePoint Server 2013 Step By Step创建第一个网站集
查看>>
一次一密密码简介
查看>>