ASP.NET Core见识录Amazing .NETAsp.net core mvc

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

2019-08-06  本文已影响14人  DAOSR

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

在如下操作中 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);
上一篇下一篇

猜你喜欢

热点阅读