0

我正在尝试读取包含日期/时间的 JSON 对象,其格式无法直接由 .NET 的 DateTime 结构解析。为了避免在我的日期/时间结构中有一个“int”字段,我编写了一个自定义 DateTimeConverter:

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

但是当我使用 JavaScriptSerializer 读取 JSON 字符串时,它不使用我的自定义转换器:

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 值的类型时。

为什么?在不编写自定义 DateTime 类型或使用 int 的情况下有什么办法吗?

4

1 回答 1

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

根据评论更新:在我看来,您应该使用 Message Inspectors 技术(请参阅http://msdn.microsoft.com/en-us/library/aa717047.aspx)。查看如何在 .NET WCF 客户端中忽略 DateTime 的时区?例如。

于 2010-06-24T08:13:00.313 回答