在实际业务中延时对象等一些属性输出到客户端是多余和不安全的
在如下操作中 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);
网友评论