自JavaScriptConverter的日期时间?日期、时间、JavaScriptConverter

2023-09-02 10:36:16 作者:封刀不再战

我有一个对象,它有一个DateTime属性......我要传递的对象从ashx的处理程序返回到通过AJAX / JSON的网页...我不希望使用第三方控件..

I have an object, it has a DateTime property... I want to pass that object from an .ashx handler back to a webpage via AJAX/JSON... I don't want to use 3rd party controls...

当我这样做:

  new JavaScriptSerializer().Serialize(DateTime.Now);

我得到这样的:

I get this:

  "/Date(1251385232334)/"

但我想2009/8/26(没关系本地化......我的应用程序是非常本地化的,所以我的日期格式假设不为辩论这个问题)。如果我让/注册自定义转换

but I want "8/26/2009" (nevermind localization... my app is very localized, so my date formatting assumptions are not up for debate in this question). If I make/register a custom converter

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

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        Dictionary<string, object> result = new Dictionary<string, object>();
        if (obj == null) return result;
        result["DateTime"] = ((DateTime)obj).ToShortDateString();
        return result;
    }

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (dictionary.ContainsKey("DateTime"))
            return new DateTime(long.Parse(dictionary["DateTime"].ToString()), DateTimeKind.Unspecified);
        return null;
    }
}

然后我得到这个结果(因为自定义序列化方法的返回值是一个字典):

then I get this result (since the return value of the custom serialize method is a dictionary):

{"DateTime":"8/27/2009"}

所以现在我的javascript,而不是做

so now in my Javascript, instead of doing

somePerson.Birthday

我必须做的。

I have to do

somePerson.Birthday.DateTime 

  or

somePerson.Birthday["DateTime"]

如何才能使定制转换器返回一个字符串,直接让我能有干净的Javascript?

how can I make the custom converter return a direct string so that I can have clean Javascript?

推荐答案

JavaScriptSerializer绝对可以做你的愿望。

JavaScriptSerializer can definitely do what you desire.

这是通过创建一个自定义转换器和串行注册它以自定义JavaScriptSerializer任何类型进行序列化。如果你有一个叫做Person的类,我们可以创建一个转换器,像这样:

It's possible to customize the serialization performed by JavaScriptSerializer for any type by creating a custom converter and registering it with the serializer. If you have a class called Person, we could create a converter like so:

public class Person
{
    public string Name { get; set; }
    public DateTime Birthday { get; set; }
}

public class PersonConverter : JavaScriptConverter
{
    private const string _dateFormat = "MM/dd/yyyy";

    public override IEnumerable<Type> SupportedTypes
    {
        get
        {
            return new[] { typeof(Person) };
        }
    }

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        Person p = new Person();
        foreach (string key in dictionary.Keys)
        {
            switch (key)
            {
                case "Name":
                    p.Name = (string)dictionary[key];
                    break;

                case "Birthday":
                    p.Birthday = DateTime.ParseExact(dictionary[key] as string, _dateFormat, DateTimeFormatInfo.InvariantInfo);
                    break;
            }
        }
        return p;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        Person p = (Person)obj;
        IDictionary<string, object> serialized = new Dictionary<string, object>();
        serialized["Name"] = p.Name;
        serialized["Birthday"] = p.Birthday.ToString(_dateFormat);
        return serialized;
    }
}

和使用这样的:

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new PersonConverter() });

Person p = new Person
            {
                Name = "User Name",
                Birthday = DateTime.Now
            };

string json = serializer.Serialize(p);
Console.WriteLine(json);
// {"Name":"User Name","Birthday":"12/20/2010"}

Person fromJson = serializer.Deserialize<Person>(json);
Console.WriteLine(String.Format("{0}, {1}", fromJson.Name, fromJson.Birthday)); 
// User Name, 12/20/2010 12:00:00 AM