今天寫一個Json.net比較偏門的用法,也許你很久都用不到,也許你明天就能派上用場。
我們都知道 Json.net 序列話的用法
Test test = new Test() { A = "123", B = DateTime.Now, C = DateTime.Now.AddDays(1) }; string json = JsonConvert.SerializeObject(test);
你會發現這一串的代碼會生成如下的東西:
{"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; } }
你會發現 生成的Json字符串是醬紫的。。。。
很神奇吧。
這里只是提供一種思路與實現方法,具體怎么變通 還需要各位看官自己的想法。
------------------------------------------------------Make by 夜色、花清淺