中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

DotNetCore跨平臺~Json動態序列化(hua)屬性

回到目錄

Json動態(tai)序列(lie)化(hua)(hua)屬性,主要(yao)為(wei)了解決一個(ge)大實體,在(zai)返回前(qian)端時根據需要(yao)去(qu)序列(lie)化(hua)(hua),如果(guo)實體里的(de)(de)某個(ge)屬性在(zai)任(ren)務(wu)情況下都不(bu)序列(lie)化(hua)(hua),可以(yi)添加[JsonIgnore]特(te)性,這種(zhong)是全局的(de)(de)過濾,但是更多的(de)(de)情況下我們需要(yao)的(de)(de)是,按(an)著某種(zhong)場景去(qu)序列(lie)化(hua)(hua)某些屬性,下面舉例說明。

兩種(zhong)場景,B2C場景和C2C場景,它們(men)需(xu)要讓PeopleDTO這個(ge)實體返(fan)回的內(nei)容不一樣,前者返(fan)回Name和Email,而后者只返(fan)回Name,這時我(wo)們(men)的JsonIgnore不能滿足,所以需(xu)要從新(xin)開發一種(zhong)新(xin)的模式。

笨方法(fa):為不(bu)同(tong)的(de)場(chang)景寫(xie)不(bu)同(tong)的(de)DTO實(shi)體,當然這會(hui)有(you)很多重(zhong)復的(de)代(dai)碼

大叔最新的Json動態序列化屬性的方法

SerializationFilterAttribute,按著場景去實現這個(ge)(ge)特性(xing),它是個(ge)(ge)基類

    /// <summary>
    /// 序列化標(biao)識特性
    /// </summary>
    [AttributeUsageAttribute(AttributeTargets.Property)]
    public abstract class SerializationFilterAttribute : Attribute
    {

    }

場景一,B2CAttribute,它需要序列(lie)化Name和Email這兩個(ge)屬性(xing),所(suo)以在 DTO實(shi)體類里會標識上(shang)它

 public class B2CAttribute : SerializationFilterAttribute
 {
 }

場景二,C2CAttribute,它只需要序列化Name這個(ge)屬性

 public class C2CAttribute : SerializationFilterAttribute
 {
 }

在(zai)實(shi)體上,我們為對(dui)應(ying)的屬性(xing)添加(jia)這兩個特(te)性(xing),讓它在(zai)序列化時(shi)按需返(fan)回(hui)

public class PeopleDTO
{
        [C2CAttribute, B2CAttribute]
        public FullNameDTO Name { get; set; }
        [B2CAttribute]
        public string Email { get; set; }
        public DateTime CreateTime { get; set; }
}

改(gai)寫我們之前的序列化(hua)(hua)方法(fa),讓它支持按需(xu)序列化(hua)(hua)

       public static string SerializeToJson<T>(T obj, SerializationFilterAttribute filter)
        {
            dynamic d = new System.Dynamic.ExpandoObject();
            foreach (var item in typeof(T).GetProperties())
            {
                if (item.GetCustomAttributes(false).Contains(filter))
                {
                    (d as System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<string, object>>).Add(new System.Collections.Generic.KeyValuePair<string, object>(item.Name, item.GetValue(obj)));
                }
            }
            var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
            return JsonConvert.SerializeObject(d);
        }

在程序的(de)調用它也很簡(jian)單,直接(jie)把對應(ying)的(de)場景(jing)特性輸入即可

           PeopleDTO peopleDTO = new PeopleDTO
            {
                Name = new FullNameDTO { LastName = "zhanling", FirstName = "zhang", ChinaName = "張(zhang)占嶺" },
                Email = "zhangsan@sina.com",
                CreateTime = DateTime.Now
            };
            var msg1 = SerializationHelper.SerializeToJson(peopleDTO, new B2CAttribute());

返回(hui)的結果如下,只包含Name和Email

{
  "Name":{
    "LastName":"zhanling",
    "ChinaName":"張占嶺"
  },
  "Email":"zhangsan@sina.com"
}

感謝各位的閱讀!

有時,一(yi)種思維的轉(zhuan)換可能會實現不(bu)同(tong)的效(xiao)果(guo)!

回到目錄

posted @ 2018-03-30 10:50  張占嶺  閱讀(2859)  評論(7)    收藏  舉報