gpt4 book ai didi

c# - 如何自定义 JSON 序列化?

转载 作者:太空狗 更新时间:2023-10-29 21:28:30 24 4
gpt4 key购买 nike

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

public class TestSerilizer
{
public int IntValue;
public DateTime DTValue;
}

和一个 Controller ,它返回序列化为 JSON 的类,看起来像这样:

public ActionResult TestJson()
{
TestSerilizer testDT = new TestSerilizer();
return Json(testDT);
}

众所周知,这会在 JSON 中生成一个看起来像 /Date(123456)/ 的日期,这是不太理想的。出于我的目的,我希望能够添加一个属性,以一种对我的观点有意义的方式来格式化我的日期。理想情况下,我想将我的 View 模型更改为如下所示:

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

这将生成具有格式化日期的 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; }
}
}

现在这可能不会使日期时间在 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"); }
}

关于c# - 如何自定义 JSON 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com