C# 如何在序列化时强制将单个属性格式化为日期而不是日期时间
在序列化为Json时,如何强制将单个属性格式化为日期而不是日期时间?我使用的是C# 如何在序列化时强制将单个属性格式化为日期而不是日期时间,c#,json,.net-core,C#,Json,.net Core,在序列化为Json时,如何强制将单个属性格式化为日期而不是日期时间?我使用的是System.Text.Json.Serialization而不是newtonsoft Json,任何需要我使用newtonsoft Json的解决方案都不会有帮助 我有一个对象,其中有两个datetime属性,一个实际上是日期,而不是datetime [JsonPropertyName("startDate")] public DateTime StartDate { get; set; } [J
System.Text.Json.Serialization
而不是newtonsoft Json,任何需要我使用newtonsoft Json的解决方案都不会有帮助
我有一个对象,其中有两个datetime属性,一个实际上是日期,而不是datetime
[JsonPropertyName("startDate")]
public DateTime StartDate { get; set; }
[JsonPropertyName("startDate")]
public DateTime ActionDateTime { get; set; }
当我设置它时,我指定它实际上是一个日期
StarDate = DateTime.Now.Date,
但是,当我尝试将其序列化为JSon时
var json = JsonSerializer.Serialize(this);
我明白了
问题是,我将此发送给的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();
}
}
我在上下搜索过,必须有一种添加属性的方法来强制将单个属性格式化为日期。它看起来像是一个应用程序,使用JsonConverter
属性可以执行您想要的操作。以下是链接文章中的示例代码:
转换器:
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));
}
您可以创建一个具有DateTime属性的“ShortDate”类型,并为此格式创建一个JsonSerializerOptions,它基本上可以在序列化时将日期字段转换为ToSortDateString()格式
大概是这样的:
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);
}
}
public类ShortDateConverter:JsonConverter
{
public override ShortDate ReadJson(JsonReader阅读器,类型objectType,ShortDate existingValue,bool hasExistingValue,JsonSerializer序列化程序)
{
返回新的ShortDate()
{
Date=DateTime.Parse((字符串)reader.Value)
};
}
public override void WriteJson(JsonWriter writer,ShortDate值,JsonSerializer序列化程序)
{
WriteValue(value.Date.ToShortDateString());
}
}
公开课短日期
{
[JsonProperty(“日期”)]
公共日期时间日期{get;set;}
公共字符串ShotDateString=>Date.ToSortDateString();
}
然后像这样使用:
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);
}
}
类程序
{
静态异步任务主(字符串[]args)
{
var ds=new ShortDate(){Date=DateTime.Now};
var json=JsonConvert.SerializeObject(dh,新JsonSerializerSettings(){Converters=new List{new ShortDateConverter()});
Console.WriteLine(json);
var obj=JsonConvert.DeserializeObject(json,新JsonSerializerSettings(){Converters=new List{new ShortDateConverter()});
控制台写入线(obj);
}
}
当然,您需要添加验证和其他内容,并在您的应用程序上注册此转换器,这样就不必总是指定此类型所需的格式化程序。但这是基本的想法。看看这个:你可以创建一个具有DateTime属性的“ShortDate”类型,并为这种格式创建一个JsonSerializerOptions,它基本上是在序列化时将日期字段转换为ToSortDateString()格式如果你不想弄乱转换器,日期结构是另一种选择。“消毒”?真的吗?@IanKemp我意识到“绝育”对一些男人来说是一个非常敏感的话题,请接受我对拼写错误的诚挚道歉。非常感谢你的简单解决方案,在这是一个非常优雅的解决方案之前,我还没有定制过转换器。