2010-06-23 62 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