2010-06-23 27 views
0

我想讀取一個JSON對象,其中包含的日期/時間格式不能直接由.NET的DateTime結構進行分析。爲了避免在我的結構日期/時間有一個「詮釋」領域,我寫了一個定製DateTimeConverter:爲什麼JavaScriptSerializer會忽略我的轉換器?

public class DateTimeConverter : JavaScriptConverter { 
    public override IEnumerable<Type> SupportedTypes { 
    get { return new Type[] { typeof(DateTime), typeof(DateTime?) }; } 
    } 

    public override IDictionary<string, object> Serialize(
    object obj, JavaScriptSerializer serializer 
) { throw new NotImplementedException(); } 

    public override object Deserialize(
    IDictionary<string, object> dictionary, Type type, 
    JavaScriptSerializer serializer 
) { 
    return DateTime.Now; 
    } 
} 

但是,當我看到一個JSON字符串的JavaScriptSerializer,它不使用我的自定義轉換器:

public struct TextAndDate { 
    public string Text; 
    public DateTime Date; 
} 

static void Main() { 
    string json = 
    "{" + 
    " \"text\": \"hello\", " + 
    " \"date\": \"1276692024\"" + 
    "}"; 

    var serializer = new JavaScriptSerializer(); 
    serializer.RegisterConverters(new [] { new DateTimeConverter() }); 
    var test = serializer.Deserialize<TextAndDate>(json); 
} 

變換器使用時我直接反序列化DateTime值,只是沒有當我反序列化包含日期時間值的類型。

爲什麼? 沒有寫任何自定義DateTime類型或使用int的任何方法?

+0

我猜簡單:它已經發現,在內置處理器匹配......因此不尋求更多。 – 2010-06-23 19:25:36

+0

不,那不是。如果我直接反序列化DateTime,則使用我的自定義轉換器。另外,請參閱MSDN:「多個轉換器可以使用相同的JavaScriptSerializer實例進行註冊,並且這些轉換器可以指示對相同類型的支持。因此,爲特定類型註冊的最後一個轉換器是將被使用的轉換器JavaScriptSerializer來序列化類型。「 – Cygon 2010-06-24 09:29:46

回答

0

你應該在你的DateTimeConverter類的小變化:

基於評論
public class DateTimeConverter : JavaScriptConverter { 
    public override IEnumerable<Type> SupportedTypes { 
     get { return new Type[] { typeof (TextAndDate) }; } 
    } 

    public override IDictionary<string, object> Serialize (
     object obj, JavaScriptSerializer serializer 
    ) { throw new NotImplementedException(); } 

    public override object Deserialize (
     IDictionary<string, object> dictionary, Type type, 
     JavaScriptSerializer serializer 
    ) { 
     if (type == typeof (TextAndDate)) { 
      TextAndDate td = new TextAndDate(); 
      if (dictionary.ContainsKey ("text")) 
       td.Text = serializer.ConvertToType<string> (
              dictionary["text"]); 
      //if (dictionary.ContainsKey ("date")) 
       td.Date = DateTime.Now; 
      return td; 
     } 
     else 
      return null; 
    } 
} 

修訂:在我看來,你應該使用消息督察技術(見http://msdn.microsoft.com/en-us/library/aa717047.aspx)。以How to ignore timezone of DateTime in .NET WCF client?爲例。

+0

謝謝,但在爲我的轉換器註冊'TextAndDate'類型本身時可能會工作,然後我必須爲由REST API返回的每個根JSON類型編寫一個自定義Converter。在轉換器中,我還必須手動關聯所有字段(如您在示例中所做的那樣)或重新實現通常由JavaScriptSerializer完成的自動字段關聯。 – Cygon 2010-06-24 09:34:35

相關問題