如何自定义JSON序列化?

Myk*_*oft 6 c# serialization json asp.net-mvc-4

目前我有一个看起来像这样的类:

public class TestSerilizer
{
    public int IntValue;
    public DateTime DTValue;
}
Run Code Online (Sandbox Code Playgroud)

和一个控制器,它返回序列化为JSON的类,如下所示:

public ActionResult TestJson()
{
    TestSerilizer testDT = new TestSerilizer();
    return Json(testDT);
}
Run Code Online (Sandbox Code Playgroud)

众所周知,这会产生一个类似于/Date(123456)/JSON 的日期,这个日期不太理想.出于我的目的,我希望能够添加一个属性,以一种对我的观点有意义的方式格式化我的日期.理想情况下,我想将我的视图模型更改为如下所示:

public class TestSerilizer
{
    public int IntValue;
    [JSONDateFormatter("hh:mm tt")]
    public DateTime DTValue;
}
Run Code Online (Sandbox Code Playgroud)

哪个会生成带有格式化日期的JSON数据.有没有办法劫持JSON序列化来做类似的事情?应该注意的是,这是一个庞大的代码库,同时具有这种隐式JSON序列化和JavaScriptSerializer类的显式使用,所以我更喜欢一种适用于这两种情况的方法,但我知道这可能是不可能的.

jzw*_*man 7

这通常是我管理对象的日期序列化的方式.请注意,这使用dataMember属性,因为它需要二进制和json可序列化:

[DataContract]
[Serializable]
public class YourClass
{
        [DataMember]
        private long timeStampLong;


        [IgnoreDataMember]
        public DateTime TimeStamp
        {
            get { return new DateTime(timeStampLong); }
            set { timeStampLong = value.Ticks; }
        }
}
Run Code Online (Sandbox Code Playgroud)

现在这可能不会使日期时间在json中可读,但它会使它保持一致.不同的json库以不同的方式处理日期时间的序列化,因此您希望能够以相同的方式强制它们全部序列化.

编辑:请注意,这不是C#属性意义上的第二个属性,而只是属性的基础字段.您可以将基础字段改为字符串,并且该基础字段永远不会暴露在对象之外.因为IgnoreDataMember您仍然只是序列化单个值.

Edit2:当有人需要实现此功能时,添加了类声明以获得更完整的答案.

编辑:有关更完整的示例,我想我会包含我使用的其他选项(以字符串作为支持字段)

    /// <summary>
    /// Representations of the TimeStamp used for serialization
    /// </summary>
    [DataMember(Name = "TimeStamp")]
    private String timeStamp;

    /// <summary>
    /// timestamp when the request is sent
    /// </summary>
    [IgnoreDataMember]
    public DateTime TimeStamp
    {
        get { return DateTime.Parse(timeStamp, null, DateTimeStyles.RoundtripKind); }
        set { timeStamp = value.ToUniversalTime().ToString("o"); }
    }
Run Code Online (Sandbox Code Playgroud)