2014-06-11 49 views
1

我正在使用Newtonsoft JSON串行器,它非常棒,速度超快,但我想用它做更多。我不確定這是可能的,因爲我所做的所有搜索都沒有任何結果。我想要的是能夠截斷空閒時間,所以當它顯示2014-01-01 00:00:00.000我只想2014-01-01最後,所以基本上全部時間全部都是零時。現在我使用這段代碼:Newtonsoft JSON如何動態更改日期格式?

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

有什麼辦法沒有時間(只有當他們全部爲零),而不會影響性能格式化這些日期?

回答

1

您可以用自定義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"] 
+0

聽起來不錯,我會嘗試...不會用if(date.ToString(「HH:mm:ss.fff」)==「00:00:00.000」){..}'來檢查時間會更好一些,我不想以m表現出明智的表現y JSON可以很容易地有幾千行 – ghiscoding

+0

不可以。從純速度的角度來看,四個整數比較肯定比解析一個格式化字符串更快,將日期格式化爲字符串,然後將格式化日期與一串零進行比較。從*實用*速度的角度來看,它不會對幾千行產生影響。使用任何一種方式更易於讀取/維護。如果您真的擔心速度問題,那麼您應該使用分析工具和度量工具來查找瓶頸,而不是進行過早的優化。 –

+0

所以你認爲4整數檢查仍然會比toString()轉換+檢查更快?其實你可能是對的,它可能會比'ToString()'轉換和字符串比較慢一點,而不僅僅是整數檢查。我想我會按照你寫的方式使用整數......我的輸出可能會有所不同,可能會增長多達50k甚至更多,所以我只是對性能有點擔心。 – ghiscoding