1. 程式人生 > >Newtonsoft.Json輸出Json時動態忽略屬性

Newtonsoft.Json輸出Json時動態忽略屬性

reat serializa ont 需求 我們 pri ret prot com

一,前言

  最近做項目采用Json形式和其他客戶端交互,借助於Newtonsoft.Json 。

  由於業務場景不同,輸出的Json內容也不同。要想忽略的屬性,可以借助Newtonsoft.Json的特性,在實體前面添加特性[JsonIgnore]即可,但有時候會根據業務需求,在不同的地方輸出同一個實體中不同的屬性,所以添加特性的方式顯然不能滿足要求。例如user表,在A場景下需要password;B場景下不需要。

二,解決辦法

  可以重寫Newtonsoft.Json的DefaultContractResolver類。

  步驟一:繼承DefaultContractResolver

  新建類繼承Newtonsoft.Json的類 DefaultContractResolver,重寫CreateProperties方法,代碼如下:

    /// <summary>
    /// Json分解器
    /// </summary>
    public class JsonPropertyContractResolver : DefaultContractResolver
    {
        IEnumerable<string> lstExclude;
        public JsonPropertyContractResolver(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));//
需要輸出的屬性 } }

  步驟二:使用方法

  假設我們需要轉化為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));

  輸出結果:

技術分享

Newtonsoft.Json輸出Json時動態忽略屬性