本文转自:
I'm using Newtonsoft JSON Serializer and it's great and super fast but I'd like to do a bit more with it. I'm not sure it's possible as all the search I've done comes up to nothing. What I would like is to be able to truncate empty time, so when it's display 2014-01-01 00:00:00.000
I just want 2014-01-01
at the end, so basically cut the entire time when they're all zeros. For now I use this piece of code:
DataTable dt = loadData();// encode the string with Newton JSON.Net string output = JsonConvert.SerializeObject(dt, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, Formatting = Newtonsoft.Json.Formatting.None, DateFormatString = "yyyy-MM-dd HH:mm:ss" });
Is there a way to format these dates without the time (only when they are all zeros) without affecting the performance?
Best How To :
You can do this with a custom JsonConverter:
class CustomDateConverter : JsonConverter{ public override bool CanConvert(Type objectType) { return (objectType == typeof(DateTime)); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { DateTime date = (DateTime)value; string format = "yyyy-MM-dd HH:mm:ss"; if (date.Hour == 0 && date.Minute == 0 && date.Second == 0 && date.Millisecond == 0) { format = "yyyy-MM-dd"; } writer.WriteValue(date.ToString(format)); } public override bool CanRead { get { return false; } } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); }}
Demo:
class Program{ static void Main(string[] args) { Listdates = new List { DateTime.Now, DateTime.Today }; JsonSerializerSettings settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, Formatting = Newtonsoft.Json.Formatting.None, Converters = new List { new CustomDateConverter() } }; string json = JsonConvert.SerializeObject(dates, settings); Console.WriteLine(json); }}
Output:
["2014-06-11 11:56:28","2014-06-11"]