Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在序列化时强制将单个属性格式化为日期而不是日期时间_C#_Json_.net Core - Fatal编程技术网

C# 如何在序列化时强制将单个属性格式化为日期而不是日期时间

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

在序列化为Json时,如何强制将单个属性格式化为日期而不是日期时间?我使用的是
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我意识到“绝育”对一些男人来说是一个非常敏感的话题,请接受我对拼写错误的诚挚道歉。非常感谢你的简单解决方案,在这是一个非常优雅的解决方案之前,我还没有定制过转换器。