1. 程式人生 > >DotNetCore跨平臺~Json動態序列化屬性

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

回到目錄

Json動態序列化屬性,主要為了解決一個大實體,在返回前端時根據需要去序列化,如果實體裡的某個屬性在任務情況下都不序列化,可以新增[JsonIgnore]特性,這種是全域性的過濾,但是更多的情況下我們需要的是,按著某種場景去序列化某些屬性,下面舉例說明。

兩種場景,B2C場景和C2C場景,它們需要讓PeopleDTO這個實體返回的內容不一樣,前者返回Name和Email,而後者只返回Name,這時我們的JsonIgnore不能滿足,所以需要從新開發一種新的模式。

笨方法:為不同的場景寫不同的DTO實體,當然這會有很多重複的程式碼

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

SerializationFilterAttribute

,按著場景去實現這個特性,它是個基類

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

    }

場景一,B2CAttribute,它需要序列化Name和Email這兩個屬性,所以在 DTO實體類裡會標識上它

 public class B2CAttribute : SerializationFilterAttribute
 {
 }

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

 public class C2CAttribute : SerializationFilterAttribute
 {
 }

在實體上,我們為對應的屬性新增這兩個特性,讓它在序列化時按需返回

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

改寫我們之前的序列化方法,讓它支援按需序列化

       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);
        }

在程式的呼叫它也很簡單,直接把對應的場景特性輸入即可

           PeopleDTO peopleDTO = new PeopleDTO
            {
                Name = new FullNameDTO { LastName = "zhanling", FirstName = "zhang", ChinaName = "張佔嶺" },
                Email = "[email protected]",
                CreateTime = DateTime.Now
            };
            var msg1 = SerializationHelper.SerializeToJson(peopleDTO, new B2CAttribute());

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

{
  "Name":{
    "LastName":"zhanling",
    "ChinaName":"張佔嶺"
  },
  "Email":"[email protected]"
}

感謝各位的閱讀!

有時,一種思維的轉換可能會實現不同的效果!

回到目錄