在web api 2中仅反序列化DateTime的Date部分

Bar*_*xto 1 c# asp.net json asp.net-web-api

有这个对象:

public class Person {
    public string FirstName { get; set; }
    [DataType(DataType.Date)]
    public DateTime Birthday { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

返回此对象作为Web Api 2中的内容为生日生成此json:

"2014-02-20T17:00:32.7114097+00:00"

我怎样才能成为:"2014-02-20"没有时间的一部分?

L.B*_*L.B 6

var json = JsonConvert.SerializeObject(
            new Person() { FirstName = "Joe", Birthday = DateTime.Now.AddDays(-2) },
            new ShortDateConverter()
            );

var p = JsonConvert.DeserializeObject<Person>(json,new ShortDateConverter());
Run Code Online (Sandbox Code Playgroud)

或用.装饰你的田地 [JsonConverter(typeof(ShortDateConverter))]

并使用像

var json = JsonConvert.SerializeObject(new Person() 
                     { FirstName = "Joe", Birthday = DateTime.Now.AddDays(-2) } );

var p = JsonConvert.DeserializeObject<Person>(json);
Run Code Online (Sandbox Code Playgroud)
public class ShortDateConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
    {
        return DateTime.ParseExact((string)reader.Value, "yyyy-MM-dd",CultureInfo.InvariantCulture);
    }

    public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
    {
        DateTime d = (DateTime)value;
        writer.WriteValue(d.ToString("yyyy-MM-dd"));
    }
}
Run Code Online (Sandbox Code Playgroud)


Muh*_*eed 6

到目前为止,最简单的方法是对内置IsoDateTimeConverter类进行子类化并设置一个不同的类DateTimeFormat

public class IsoDateConverter : IsoDateTimeConverter
{
    public IsoDateConverter() => 
        this.DateTimeFormat = Culture.DateTimeFormat.ShortDatePattern;
}

public class Foo
{
    [JsonConverter(typeof(IsoDateConverter))]
    public DateTimeOffset Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 一个不错且干净的解决方案,比公认的解决方案简单。对我来说效果很好。 (2认同)
  • 我会添加`Culture.DateTimeFormat.ShortDatePattern`而不是硬编码的“ yyyy-MM-dd”。因此,我们可以依赖文化。 (2认同)
  • 如果您使用的是“Culture.DateTimeFormat.ShortDatePattern”,则您使用的是文化格式,而不是 ISO 格式。 (2认同)