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类的显式使用,所以我更喜欢一种适用于这两种情况的方法,但我知道这可能是不可能的.
这通常是我管理对象的日期序列化的方式.请注意,这使用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)
| 归档时间: |
|
| 查看次数: |
1585 次 |
| 最近记录: |