zoukankan      html  css  js  c++  java
  • 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 这些属性的序列化。

  • 相关阅读:
    内置函数详解
    lambda函数
    第八章(5)
    第八章(4)
    第八章(3)
    第八章(2)
    第八章(1)
    第七章(3)
    第七章(2)
    第七章(1)
  • 原文地址:https://www.cnblogs.com/leonsky/p/3300511.html
Copyright © 2011-2022 走看看