Newtonsoft.Json 自定义日期序列化

本文关键字:序列化 日期 自定义 Json Newtonsoft | 更新日期: 2023-09-27 17:56:16

我正在使用Newtonsoft.Json将我的日期从 C# 序列化为 JSON。我想做的是让 json 序列化程序使用当前区域性将日期格式化为字符串。

这是我通过我的 Json 序列化程序得到的:

JsonConvert.SerializeObject(DateTime.Now);

结果是:

"2016-07-08T17:10:17.6722753-05:00"

但我更喜欢的是:

"08/07/2016 17:10:57"

因为我当前的文化是巴西,我希望我的日期以上述方式显示。

是否可以全局(对于可能序列化的任何日期)告诉 Newtonsoft.Json 中的 json 序列化程序使用,就好像它正在执行date.ToString()一样(因为 ToString 尊重 System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat 中的区域性并相应地提供正确的格式)

Newtonsoft.Json 自定义日期序列化

您需要

将 JsonSerializerSettings.DateFormatString 设置为所需的格式。

var jsonSettings = new JsonSerializerSettings();
jsonSettings.DateFormatString = "dd/MM/yyyy hh:mm:ss";
string json = JsonConvert.SerializeObject(someObject, jsonSettings);

之后,您可以在每次使用序列化程序时传递设置对象,也可以按照 dbc 引用的答案中的步骤进行操作。虽然,你没有提到它的运行位置(ASP.NET、桌面、UWP 等),因此全局设置方式可能会有所不同。

是的,您可以在 JsonSerializer 设置中使用转换器。

public class SpecialDateTimeConverter : DateTimeConverterBase
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
        public override void WriteJson(JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
        {
             writer.WriteValue(((DateTime)value).ToString("dd/MM/yyyy hh:mm:ss"));
        }
    }
    string convertedDateTime = JsonConvert.SerializeObject(DateTime.Now, Formatting.Indented, new SpecialDateTimeConverter());