回到目录

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动态序列化属性的更多相关文章

  1. Json动态添加属性

    一维Json: var Json={}: Json.name="小明"; Json.age="12": Json.sex="男": 输出效果 ...

  2. C#对 Json的序列化和反序列化时出现“k_BackingField”

    在C#2.0的项目中,以前经常使用Json.NET实现序列化和反序列化.后来从c#3.0中开始使用新增的DataContractJsonSerializer进行json相关的操作.微软提供的原生类库使 ...

  3. 转载自——Json.net动态序列化以及对时间格式的处理

    关于我工作中对Json处理的东西 第一:动态序列化类 第二:时间格式处理 通常我们一个类里 可能有十到更多的属性,但是我们序列化通常只需要序列化其中的 三到五个这样的话就会有多余的数据 如果 我只想序 ...

  4. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  5. EF 实体+ Newtonsoft.Json 输出JSON 时动态忽略属性的解决方法

    最近的项目采用的是 ASP.NET mvc 4.0 + entity framework 5.0 ,后台以JSON形式抛出数据是借助于Newtonsoft.Json ,   要想忽略的属性前面添加特性 ...

  6. 遍历json 对象的属性并且动态添加属性

    昨天因为公司的一个需求,所以就研究了一下json对象的属性的遍历和动态修改: var person= { name: 'zhangsan', pass: '123' , 'sni.ni' : 'sss ...

  7. 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

  8. [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

    [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...

  9. 在C#中,Json的序列化和反序列化的几种方式总结

    在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...

随机推荐

  1. An internal error occurred during: "Requesting JavaScript AST from selection". GC overhead limit exc

    1.错误描述 An internal error occurred during: "Requesting JavaScript AST from selection".     ...

  2. hibernate学习(四)hibernate的一级缓存&快照

    缓存:提高效率 硬件的 CPU缓存   硬盘缓存   内存 软件的  io流缓存 hibernate  的一级缓存   也是为了操作数据库的效率. 证明一级缓存在  : Person p=sessio ...

  3. 使用图片作为a标签的点击按钮时,当触发touchstart的时候,往往会有一个灰色的背景,想要去掉的话可以用下面这种方式

    a,a:hover,a:active,a:visited,a:link,a:focus{    -webkit-tap-highlight-color:rgba(0,0,0,0);    -webki ...

  4. class-朴素贝叶斯NaiveBayes

    1 朴素贝叶斯法的学习与分类1.1 基本原理2 参数估计2.1 极大似然估计2.2 算法2.3 贝叶斯估计 1 朴素贝叶斯法的学习与分类 Naive Bayes是基于贝叶斯定理和特征条件独立的假设的分 ...

  5. poi 导入导出的api说明(大全)

    原文链接:http://www.cnblogs.com/qingruihappy/p/8443101.html poi 导入导出的api说明(大全) 一. POI简介 ApachePOI是Apache ...

  6. Linux之shell典型应用之脚本实现

    一. 提取Linux操作系统信息 二. 获取操作系统运行状态 三. 分析应用状态 四. 应用日志分析 第一章:VIM编辑器设置 一.语法高亮     syntax on/off 二.显示行号 set ...

  7. 基于Global.asax实现显示当前在线人数--ASP.NET基础

    相对来说比较简单,直接贴代码了哈: Global.asax: <%@ Application Language="C#" %><script runat=&quo ...

  8. RobotFramework下的http接口自动化Set Request Body 关键字的使用

    Set Request Body关键字用来设置http 请求时的body 信息,尤其是在post 请求时,经常需要用到这个关键字. 该关键字接收一个参数,[ body ] 示例1:登录博客园(http ...

  9. 【BZOJ1968】约数研究(数论)

    [BZOJ1968]约数研究(数论) 题面 BZOJ链接(题目是图片形式的) 题解 傻逼题 \(NOIP\) \(T1\)难度 不会做的话您可以退役 #include<iostream> ...

  10. java怎么解析带有特殊字符的字符串

    可以使用StringEscapeUtils这个工具类.