【问题标题】:How to force a single property to format as a Date and not a Date time when serializing序列化时如何强制单个属性格式化为日期而不是日期时间
【发布时间】:2021-08-09 20:01:36
【问题描述】:

当序列化为 Json 时,如何强制将单个属性格式化为 Date 而不是 DateTime?我使用的是System.Text.Json.Serialization 而不是 newtonsoft json,任何需要我使用 NewtonSoft json 的解决方案都无济于事。

我有一个对象,其中有两个日期时间属性,一个实际上是日期而不是日期时间。

[JsonPropertyName("startDate")]
public DateTime StartDate { get; set; }
[JsonPropertyName("startDate")]
public DateTime ActionDateTime { get; set; }

当我设置它时,我指定它实际上是一个日期。

StarDate = DateTime.Now.Date,

但是当我尝试将其序列化为 JSon 时

var json = JsonSerializer.Serialize(this);

我明白了

{"startDate":"2021-05-20T00:00:00+02:00"}

问题是我发送给它的 API 端点抱怨它是一个日期时间,它需要序列化为一个日期。我知道我可以使用 JsonSerializerOptions 但这会序列化所有日期,我不能这样做。

完整的代码示例供您享受测试

 public class Dummy
    {
        [JsonPropertyName("startDate")]
        public DateTime StartDate { get; set; }
        [JsonPropertyName("actiondatetime ")]
        public DateTime ActionDateTime { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var hold = new Dummy();
            hold.StartDate = DateTime.Now.Date;
            hold.ActionDateTime = DateTime.Now
            var json = JsonSerializer.Serialize(hold);
            Console.WriteLine(json);
            Console.ReadLine();
        }
    }

我已经搜索了高低必须有一种方法可以添加属性以强制将单个属性格式化为日期。

【问题讨论】:

  • 您可以创建一个具有 DateTime 属性的“ShortDate”类型,并为此格式创建一个 JsonSerializerOptions,基本上将 Date 字段转换为序列化时的 ToShortDateString() 格式
  • 如果你不想弄乱转换器,日期结构是另一种选择。
  • “消毒”?真的吗?
  • @IanKemp 我意识到“消毒”对一些男人来说可能是一个非常敏感的话题,请接受我对我的拼写错误的诚挚道歉。

标签: c# json .net-core


【解决方案1】:

看起来使用JsonConverter 属性应用的custom converter 可以做你想做的事。以下是链接文章中的示例代码:

转换器:

public class DateTimeOffsetJsonConverter : JsonConverter<DateTimeOffset>
{
    public override DateTimeOffset Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options) =>
            DateTimeOffset.ParseExact(reader.GetString(),
                "MM/dd/yyyy", CultureInfo.InvariantCulture);

    public override void Write(
        Utf8JsonWriter writer,
        DateTimeOffset dateTimeValue,
        JsonSerializerOptions options) =>
            writer.WriteStringValue(dateTimeValue.ToString(
                "MM/dd/yyyy", CultureInfo.InvariantCulture));
}

使用属性应用:

public class WeatherForecastWithConverterAttribute
{
    [JsonConverter(typeof(DateTimeOffsetJsonConverter))]
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string Summary { get; set; }
}

【讨论】:

  • 非常感谢您提供的简单解决方案,在此之前我还没有制作过自定义转换器,这是一个非常优雅的解决方案。
【解决方案2】:

您可以创建一个具有 DateTime 属性的“ShortDate”类型,并为此格式创建一个 JsonSerializerOptions,基本上在序列化时将 Date 字段转换为 ToShortDateString() 格式。

类似这样的:

public class ShortDateConverter : JsonConverter<ShortDate>
    {
        public override ShortDate ReadJson(JsonReader reader, Type objectType, ShortDate existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            return new ShortDate()
            {
                Date = DateTime.Parse((string)reader.Value)
            };
        }

        public override void WriteJson(JsonWriter writer, ShortDate value, JsonSerializer serializer)
        {
            writer.WriteValue(value.Date.ToShortDateString());
        }
    }

    public class ShortDate
    {
        [JsonProperty("date")]
        public DateTime Date { get; set; }
        public string ShotDateString => Date.ToShortDateString();
    }

并像这样使用:

class Program
    {
        static async Task Main(string[] args)
        {
            var ds = new ShortDate() { Date = DateTime.Now };
            var json = JsonConvert.SerializeObject(dh, new JsonSerializerSettings() { Converters = new List<JsonConverter> { new ShortDateConverter() } });

            Console.WriteLine(json);

            var obj = JsonConvert.DeserializeObject<ShortDate>(json, new JsonSerializerSettings() { Converters = new List<JsonConverter> { new ShortDateConverter() } });

            Console.WriteLine(obj);
    }
}

当然,您需要添加验证和其他内容,并在您的应用上注册此转换器,这样您就不必总是为此类型指定您想要的格式化程序。但这是基本思想。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2011-11-20
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多