2014-09-03 47 views
2

序列化通用的鍵值項問題,我有這樣的階級結構:在Newtonsoft

public class GraphDataItem<TCategory, TValue> 
{ 
    public TCategory Category { get; set; } 
    public TValue Value { get; set; } 

    public GraphDataItem(TCategory category, TValue value) 
    { 
     Category = category; 
     Value = value; 
    } 
} 

我有這個項目的集合,即序列化使用是這樣的:

List<GraphDataItem<DateTime, int>> items = GetItems(); 
var json = JsonConvert.SerializeObject(items); 

的JSON輸出我看起來是這樣的:

[{"Category":"2014-04-30T00:00:00","Value":1}, 
{"Category":"2014-05-01T00:00:00","Value":38}, 
{"Category":"2014-05-02T00:00:00","Value":18}] 

我想默認的DateTime序列化行爲,這將產生一些荷蘭國際集團這樣的:

[{"Category":/Date(1245398693390)/,"Value":1}, 
{"Category":/Date(1245398693390)/,"Value":38}, 
{"Category":/Date(1245398693390)/,"Value":18}] 

我懷疑庫呼籲類別的的toString()而不是標準的方法。我能做什麼?

回答

3

嘗試使用DateFormatHandlingDateTimeZoneHandling設置時序列化,如:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat; 
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; 

List<GraphDataItem<DateTime, int>> items = GetItems(); 
var json = JsonConvert.SerializeObject(items, settings); 
+0

謝謝,這正是我需要的 – 2014-09-03 20:34:03

+0

沒問題;樂意效勞。 – 2014-09-03 20:34:14

1

JSON.Net使用的默認日期序列化格式是Microsoft日期格式。所以你應該得到像你想要的日期。確保序列化時,您沒有使用IsoDateTimeConverter

關於不同日期序列化選項的post可能會有幫助。

此外,如果您使用的是最新的JSON.Net,則可以使用serialization tracing來查看裏面發生了什麼。這可能會提供有用的線索,爲什麼會發生這種情況,或者如何強制它產生正確的輸出。

如果一切都失敗了,你可能不得不求助於您的自定義JsonConverter:

public class CustomConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     ... 
     if(value is DateTime) { 
      var d = value as DateTime; 
      serializer.Serialize(writer, d); 
     } 
     else { 
      serializer.Serialize(writer, value); 
     } 

     ... 
    } 

    // other overrides 
} 
+0

*默認的日期JSON.Net使用的序列化格式是Microsoft日期格式*。這不再是事實。缺省值是ISO日期格式;自4.5版本發佈以來,它就一直如此。請參閱發佈說明[此處](https://json.codeplex.com/releases/view/84550)。 – 2014-09-03 20:26:59

+0

啊,這就解釋了。所以在這種情況下,你的答案應該照顧它。 – Mrchief 2014-09-03 20:28:02