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跨平台~Json动态序列化属性的更多相关文章
- Json动态添加属性
一维Json: var Json={}: Json.name="小明"; Json.age="12": Json.sex="男": 输出效果 ...
- C#对 Json的序列化和反序列化时出现“k_BackingField”
在C#2.0的项目中,以前经常使用Json.NET实现序列化和反序列化.后来从c#3.0中开始使用新增的DataContractJsonSerializer进行json相关的操作.微软提供的原生类库使 ...
- 转载自——Json.net动态序列化以及对时间格式的处理
关于我工作中对Json处理的东西 第一:动态序列化类 第二:时间格式处理 通常我们一个类里 可能有十到更多的属性,但是我们序列化通常只需要序列化其中的 三到五个这样的话就会有多余的数据 如果 我只想序 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- EF 实体+ Newtonsoft.Json 输出JSON 时动态忽略属性的解决方法
最近的项目采用的是 ASP.NET mvc 4.0 + entity framework 5.0 ,后台以JSON形式抛出数据是借助于Newtonsoft.Json , 要想忽略的属性前面添加特性 ...
- 遍历json 对象的属性并且动态添加属性
昨天因为公司的一个需求,所以就研究了一下json对象的属性的遍历和动态修改: var person= { name: 'zhangsan', pass: '123' , 'sni.ni' : 'sss ...
- 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- 在C#中,Json的序列化和反序列化的几种方式总结
在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...
随机推荐
- String getProperty(String key, String def)
String getProperty(String key, String def) 获取用指定键描述的系统属性. * 若key 系统环境或properties等配置文件的键,如os.name等,返回 ...
- httpclient的理解(代码理解)
一,httpclient的理解 httpcliet就是模仿浏览器在服务器内部从一个项目调用另一个项目的技术.比如说调用接口等. HttpClient 是 Apache Jakarta Common ...
- View的平移、缩放、旋转以及位置、坐标系
原创 2015年05月12日 13:15:29 标签: Android / Scroll / Scale / Translation / Rotation 24733 Android开发中,经常会接触 ...
- [APIO2009]会议中心
[APIO2009]会议中心 题目大意: 原网址与样例戳我! 给定n个区间,询问以下问题: 1.最多能够选择多少个不相交的区间? 2.在第一问的基础上,输出字典序最小的方案. 数据范围:\(n \le ...
- 【BZOJ2816】【ZJOI2012】网络(Link-Cut Tree)
[BZOJ2816][ZJOI2012]网络(Link-Cut Tree) 题面 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相 ...
- 对网易云音乐参数(params,encSecKey)的分析
我们如果对网易云音乐进行爬虫的话,我们会发现,提交的参数是(params,encSecKey),然而这两个参数是一串很长的东西 我们要对网易云进行爬虫,那么就一定要将这两个参数弄明白,然后才可以进行爬 ...
- 微信小程序之实现页面缩放式侧滑效果
效果图: 实现原理:点击按钮,往需要动画的div中添加或移除拥有动画效果的class. 由于微信小程序中不能操作page这个根节点,所以,只有用一个div(view)来模仿page根节点. 1.结构 ...
- gulp详细入门
gulp是基于Nodejs的自动任务运行器, 她能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的的测试.检查.合并.压缩.格式化.浏览器自 ...
- angular路由详解一(基础知识)
本人原来是iOS开发,没想到工作后,离iOS开发原来越远,走上了前端的坑.一路走来,也没有向别人一样遇到一个技术上的师傅,无奈只能一个人苦苦摸索.如今又开始填angular的坑了.闲话不扯了.(本人学 ...
- MongoDB 搭建文件存储的方案
用云的话,节省你开发成本,快速上线,数据比较安全.缺点是一旦用了他们的,形成习惯以后,数据想迁移就会比较麻烦,你会越来越依赖,而且规模上去以后价格并不低.早年自己做的话,你需要实现分布式文件系统,这个 ...