• 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"
    }

    感谢各位的阅读!

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

    回到目录

  • 相关阅读:
    Linux下一些命令
    Javascript实现Base64解码
    C语言中指针和数组的区别
    hdu 1166 线段树 解法 484MS
    fatjar: eclipse导出工具
    每天一道面试题(1)~~~
    windows Emacs的安装与配置
    编程者入门:谈Servlet/JSP的配置详解
    RMQ谈:Range Minimum/Maximum Query 区间最小/大值查询 ST优化
    Lisp in a box 装配指南
  • 原文地址:https://www.cnblogs.com/lori/p/8674952.html
Copyright © 2020-2023  润新知