当前位置: 首页 > 面试题库 >

是否为DateTime自定义JavaScriptConverter?

傅博容
2023-03-14
问题内容

我有一个对象,它具有DateTime属性…我想将该对象从.ashx处理程序通过AJAX / JSON传递回网页…我不想使用第三方控件…

当我这样做时:

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

我得到这个:

  "\/Date(1251385232334)\/"

但是我想输入“
2009年8月26日”(不要介意本地化…我的应用程序非常本地化,因此我的日期格式设置假设不值得在这个问题上进行辩论)。如果我制作/注册自定义转换器

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

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

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

所以现在在我的Javascript中,而不是

somePerson.Birthday

我要做

somePerson.Birthday.DateTime

  or

somePerson.Birthday["DateTime"]

如何使自定义转换器返回直接字符串,以便可以使用干净的Javascript?


问题答案:

JavaScriptSerializer绝对可以满足您的需求。

通过创建自定义转换器并将其注册到序列化器中,可以针对任何类型来自定义JavaScriptSerializer执行的序列化。如果您有一个名为Person的类,我们可以这样创建一个转换器:

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


 类似资料:
  • 问题内容: 我有一些需要经常打印的结构。现在,我正在围绕该结构使用经典的打印包装器: 此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用 va_arg 系列添加或添加一些文本,但是我觉得我会重新实现。 我想知道是否有可能向printf编写自定义函数。我希望能够写这样的东西: 这可能吗 ?我怎样才能做到这一点 ? 注意:我在Ubuntu Linux 10.0

  • 问题内容: 最近,我阅读了越来越多的关于人们在其HTML标记中使用自定义属性的信息,主要目的是为了嵌入一些额外的数据以供javascript代码使用。 我希望就使用自定义属性是否是一种好习惯以及一些替代方法收集一些反馈。 现在看来似乎真的可以简化 既 服务器端和客户端的代码,但它也不是W3C标准。 我们是否应该在Web应用程序中使用自定义HTML属性?为什么或者为什么不? 对于那些认为自定义属性是

  • 我希望用户能够编辑管理后端面板上自己的电子邮件内容,用户可以使用一些指令,如: 因此,例如,用户可以在 : 我如何在Laravel中创建一些自定义指令,任何我可以用来简化开发的库?当然,用户不允许使用PHP代码。 我知道有Laravel刀片,但我不确定这是安全的,用于公众用户编辑内容和只允许客户指令。

  • 问题内容: 最近,我阅读了越来越多的关于人们在其HTML标记中使用自定义属性的信息,主要目的是为了嵌入一些额外的数据以供javascript代码使用。 我希望就使用自定义属性是否是一种好习惯以及一些替代方法收集一些反馈。 现在看来似乎真的可以简化 既 服务器端和客户端的代码,但它也不是W3C标准。 我们是否应该在Web应用程序中使用自定义HTML属性?为什么或者为什么不? 对于那些认为自定义属性是

  • 问题内容: 我正在Eclipse中进行学校项目的工作,当我尝试在 上使用方法时,Eclipse显示以下错误: 类型为String的方法isEmpty()未定义 我已经运行了Java更新,但仍在获取它。有什么原因会导致此 方法不确定? 问题答案: 在Java6中添加了String.isEmpty()。在早期版本中,可以 从Apache的commons-lang库中使用。StringUtils.isE

  • 我希望我的日期时间总是保存为以下格式:yMMMd 即 2021 年 3 月 30 日 问题: 当我格式化我的日期时间时,它格式化为字符串。当我尝试将其解析回DateTime时,我收到错误并且没有成功。 我在寻找解决这个问题的好方法时遇到了问题。 这是可能的还是我必须满足于保存为字符串? 编辑 尝试了所有推荐的方法,也尝试了许多其他方法,但也不起作用。我想知道Intl包日期格式是否无法解析回Date