欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

DotNetCore跨平台~Json动态序列化属性

程序员文章站 2024-01-23 08:22:10
回到目录 Json动态序列化属性,主要为了解决一个大实体,在返回前端时根据需要去序列化,如果实体里的某个属性在任务情况下都不序列化,可以添加[JsonIgnore]特性,这种是全局的过滤,但是更多的情况下我们需要的是,按着某种场景去序列化某些属性,下面举例说明。 两种场景,B2C场景和C2C场景,它 ......

回到目录

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

感谢各位的阅读!

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

回到目录