Json.Net如何在序列化之前修改屬性值
我們都知道 Json.net 序列話的用法 Test test = new Test() { A = "123", B = DateTime.Now, C = DateTime.Now.AddDays(1) }; string json = JsonConvert.SerializeObject(test);你會發現這一串的代碼會產生如下的東西: 1{"A":"123","B":"2014-09-14T19:08:11.8653266+08:00","C":"2014-09-15T19:08:11.8663266+08:00"}這本身沒有什麼問題 假如你遇到一個比較扯淡的需求 如下 : 我要 B 跟C 產生的Json字串不顯示時間 我要它顯示一個時間差的秒數(int 類型) 我該如何處理 之前問過許多人 都沒做過這樣的需求 也獲得了一些建議 比如 修改產生完的字串 又或者 在實體類裡邊加兩個屬性 顯示出來 這樣雖然能解決問題 但是 如果我有十個類 一百個類呢 而且每個類跟每個類的屬性名稱又不一樣。。。想想就覺得可怕 後來果斷的放棄了這種想法 我在想有沒有一種方法 可以在產生Json串之前 就能把這屬性的值修改掉 那豈不是會很美好。。。。嘖嘖嘖 後來查看Json.net的源碼 還真讓我發現了一種方法 代碼如下: 複製代碼class Test { public string A { get; set; } public DateTime B { get; set; } public DateTime? C { get; set; } } class Program { static void Main(string[] args) { Test test = new Test() { A = "123", B = DateTime.Now, C = DateTime.Now.AddDays(1) }; JsonConverter jc = new DateConverter(); string json = JsonConvert.SerializeObject(test, jc); Console.WriteLine(json); } } public class DateConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { DateTime i = (DateTime)value; writer.WriteValue("原來我可以修改Model裡DateTime類型的值"); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanConvert(Type objectType) { if (objectType == typeof(DateTime)) return objectType == typeof(DateTime); else if (objectType == typeof(DateTime?)) return objectType == typeof(DateTime?); else return false; } }