您可以用自定義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();
}
}
演示:
class Program
{
static void Main(string[] args)
{
List<DateTime> dates = new List<DateTime>
{
DateTime.Now,
DateTime.Today
};
JsonSerializerSettings settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Formatting = Newtonsoft.Json.Formatting.None,
Converters = new List<JsonConverter> { new CustomDateConverter() }
};
string json = JsonConvert.SerializeObject(dates, settings);
Console.WriteLine(json);
}
}
輸出:
["2014-06-11 11:56:28","2014-06-11"]
聽起來不錯,我會嘗試...不會用if(date.ToString(「HH:mm:ss.fff」)==「00:00:00.000」){..}'來檢查時間會更好一些,我不想以m表現出明智的表現y JSON可以很容易地有幾千行 – ghiscoding
不可以。從純速度的角度來看,四個整數比較肯定比解析一個格式化字符串更快,將日期格式化爲字符串,然後將格式化日期與一串零進行比較。從*實用*速度的角度來看,它不會對幾千行產生影響。使用任何一種方式更易於讀取/維護。如果您真的擔心速度問題,那麼您應該使用分析工具和度量工具來查找瓶頸,而不是進行過早的優化。 –
所以你認爲4整數檢查仍然會比toString()轉換+檢查更快?其實你可能是對的,它可能會比'ToString()'轉換和字符串比較慢一點,而不僅僅是整數檢查。我想我會按照你寫的方式使用整數......我的輸出可能會有所不同,可能會增長多達50k甚至更多,所以我只是對性能有點擔心。 – ghiscoding