ASP.NET Core REST API JSON 排除实体对

作者: DAOSR | 来源:发表于2019-08-06 12:39 被阅读14次

    在实际业务中延时对象等一些属性输出到客户端是多余和不安全的

    在如下操作中 Edit 方法将把 User 对象的 Group 和 PassWord 属性直接输出

    public class UserGroup
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    
    public class User
    {
        public int ID { get; set; }
        public int GroupID { get; set; }
        public virtual UserGroup Group { get; set; }
        public string UserName { get; set; }
        //加上 virtual 在后面会用到
        public virtual string PassWord { get; set; }
    }
    
    public object Edit(int id)
    {
        return _unitOfWork.GetRepository<User>().Find(id);
    }
    

    要排除这些属性我们只需重写一个继承自 DefaultContractResolver 的分析器,排除带 virtual 的属性

    public class JsonContractResolver : DefaultContractResolver
    {
        protected override string ResolvePropertyName(string propertyName) => propertyName?.ToLower(); // 将属性名统一改为小写,不需要可以直接删除该段
    
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            if (member.MemberType == MemberTypes.Property)
            {
                var method = ((PropertyInfo)member).GetGetMethod();
                if (method.IsVirtual && !method.IsFinal) return null; // 判断是否包含 virtual 关键字,判断 final 可以保留接口属性
            }
            return base.CreateProperty(member, memberSerialization);
        }
    }
    

    最后在 Startup.cs 中 services.AddMvc() 上加入配置

    services.AddMvc().AddJsonOptions(options=> {
        options.SerializerSettings.ContractResolver = new JsonContractResolver();
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    相关文章

      网友评论

        本文标题:ASP.NET Core REST API JSON 排除实体对

        本文链接:https://www.haomeiwen.com/subject/jteidctx.html