zoukankan      html  css  js  c++  java
  • Newtonsoft.Json输出Json时动态忽略属性

    一,前言

      最近做项目采用Json形式和其他客户端交互,借助于Newtonsoft.Json 。

      由于业务场景不同,输出的Json内容也不同。要想忽略的属性,可以借助Newtonsoft.Json的特性,在实体前面添加特性[JsonIgnore]即可,但有时候会根据业务需求,在不同的地方输出同一个实体中不同的属性,所以添加特性的方式显然不能满足要求。例如user表,在A场景下需要password;B场景下不需要。

    二,解决办法

      可以重写Newtonsoft.Json的DefaultContractResolver类。

      步骤一:继承DefaultContractResolver

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

    public class JsonPropertyContractResolver : DefaultContractResolver
        {
            IEnumerable<string> lstInclude;
            public JsonPropertyContractResolver(IEnumerable<string> includeProperties)
            {
    
                lstInclude = includeProperties;
            }
    
            protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
            {
    
                return base.CreateProperties(type, memberSerialization).ToList().FindAll(p => lstInclude.Contains(p.PropertyName));//需要输出的属性  } }
            }
        }

      步骤二:使用方法

      假设我们需要转化为Json的实体列表是Product,场景一,这个列表中的Price属性不需要转成Json到前端;场景二,这个列表中的ShopID和Count属性不需要转成Json到前端。代码如下:

    List<Product> ProductList = new List<Product>
                                                    {
                                                        new Product
                                                        {
                                                            ShopID = 1,
                                                            Price=10,
                                                            Count=4,
                                                            Name = "商品一"
                                                        },
                                                        new Product
                                                        {
                                                            ShopID = 2,
                                                             Price=11,
                                                            Count=3,
                                                            Name = "商品二"
                                                        },
                                                        new Product
                                                        {
                                                            ShopID = 1,
                                                             Price=12,
                                                            Count=1,
                                                            Name = "商品三"
                                                        },
                                                        new Product
                                                        {
                                                            ShopID = 2,
                                                             Price=17,
                                                            Count=10,
                                                            Name = "商品四"
                                                        },
                                                        new Product
                                                        {
                                                            ShopID = 3,
                                                            Price=13,
                                                            Count=2,
                                                            Name = "商品五"
                                                        }
                                                    };
    
                //场景一
                string jsonString = JsonConvert.SerializeObject(ProductList, Formatting.Indented, new JsonSerializerSettings
                {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                    ContractResolver = new JsonPropertyContractResolver(new List<string> { "ShopID", "Name", "Count" })
                });
                Console.WriteLine("场景一:" + jsonString);
    
                //场景二
                JsonSerializerSettings settings = new JsonSerializerSettings();
                settings.Formatting = Formatting.Indented;
                settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                settings.ContractResolver = new JsonPropertyContractResolver(new List<string> { "Name", "Price" });
                Console.WriteLine("场景二:" + JsonConvert.SerializeObject(ProductList, settings));

      输出结果:

  • 相关阅读:
    面向对象进阶
    EasyDSS转码模块关于gRPC服务注册到ETCD的实现过程
    如何通过ETCD实现EasyDSS分布式负载均衡?ETCD部署方案
    EasyDSS_dash版本如何在新内核下实现rtsp源地址的分发?
    EasyDSS因为系统时间导致的闪退分析及处理
    EasyScreenLive推流组件推RTSP流到EasyDSS操作过程分享
    【解决方案】无人机+EasyDSS实现直播推流警务安防类行业应用
    EasyDSS转码服务负载均衡采用grpc balance回报找不到结构体问题排查及修复
    EasyDSS视频直播时直播间接口和实际接口为什么会存在差异?
    在线课堂EasyDSS_dash版本虚拟直播RTSP播放无视频流问题
  • 原文地址:https://www.cnblogs.com/weixiao520/p/7143543.html
Copyright © 2011-2022 走看看