EF 实体+ Newtonsoft.Json 输出JSON 时动态忽略属性的解决方法

最近的项目采用的是 ASP.NET mvc 4.0 + entity framework 5.0 ,后台以JSON形式抛出数据是借助于Newtonsoft.Json ,

要想忽略的属性前面添加特性[JsonIgnore]即可,但有时候会根据业务需求 在不同的地方抛出不同的属性,所以添加特性的方式显示不能满足要求

所以就在设想Newtonsoft.Json 能否动态控制属性是否序列化成JSON,就这问题也找了一些资料,现就解决方法做备忘,希望各位有更好的方法告知。

解决方法:

重写Newtonsoft.Json 的分解器

步骤

1.新建类继承Newtonsoft.Json的类 DefaultContractResolver,重写CreateProperties方法,代码如下:

?
public class ExcludePropertiesContractResolver : DefaultContractResolver
{
     IEnumerable< string > lstExclude;
     public ExcludePropertiesContractResolver(IEnumerable< string > excludedProperties)
     {
         lstExclude = excludedProperties;
     }
     protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
     {
         return base .CreateProperties(type, memberSerialization).ToList().FindAll(p => !lstExclude.Contains(p.PropertyName));
     }
}

  这里也可以变通写成。只创建传入的属性,上面代码是排除传入的属性,是只创建指定属性,还是只创建指定属性之外其它的属性,就看大家需求和爱好了

2.使用方法:假设我们需要转化为JSON的EF实体列表是taskList,这个列表中的EF实体包含了延迟加载属性,刚好这些延迟加载属性不需要转成JSON到前端,如下代码:

?
string jsonString = JsonConvert.SerializeObject(taskList, Formatting.Indented, new JsonSerializerSettings
{
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
     ContractResolver = new ExcludePropertiesContractResolver( new List< string > { "ApplyUser" , "StartUser" , "CompleteUser" , "AuthoriseUser" , "Tests" })
});

  上面代码排除了 申请人 ApplyUser,开始人StartUser,完成人CompleteUser,审核人AuthoriseUser,测试集 Tests 这些属性的序列化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值