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) ...
随机推荐
- zTree实现删除树节点
zTree实现删除树节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</titl ...
- freemarker报错之一
freemarker 1.错误描述 java.io.FileNotFoundException: Template user.ftl not found. at freemarker.template ...
- JSP中的include有哪些?有什么区别?
JSP中的include有哪些?有什么区别? 1.JSP中的include有哪些 (1)<%@include file="" %> (2)<jsp:include ...
- python实现简单排序算法
算法 递归两个特点: 调用自身 有穷调用 计算规模越来越小,直至最后结束 用装饰器修饰一个递归函数时会出现问题,这个问题产生的原因是递归的函数也不停的使用装饰器.解决方法是,只让装饰器调用一次即可,那 ...
- 使input文本框不可编辑的3种方法
一:disabled disabled 属性规定应该禁用 input 元素,被禁用的 input 元素,不可编辑,不可复制,不可选择,不能接收焦点,后台也不会接收到传值.设置后文字的颜色会变成灰色.d ...
- C#技术点--修改系统时间
C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员.用过VC.VB等的朋友可能知道,我们可以调用Win32 ...
- 用VSCode开发一个asp.net core 2.0+angular 5项目(4): Angular5全局错误处理
第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.html 第三 ...
- Python基础_函数闭包、调用、递归
这节的主要内容是函数的几个用法闭包,调用.递归. 一.函数闭包 对闭包更好的理解请看:https://www.cnblogs.com/Lin-Yi/p/7305364.html 我们来看一个简单的例子 ...
- 【转载】Spark运行架构
1. Spark运行架构 1.1 术语定义 lApplication:Spark Application的概念和Hadoop MapReduce中的类似,指的是用户编写的Spark应用程序,包含了一个 ...
- poi导入Excel,数字科学记数法转换
在这里分享一下使用poi 导入Excel时 把数字转换为科学记数法的解决方法: 就是使用DecimalFormat对 i 进行了格式化 结果为: