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

时间:2014-02-20 17:03:31

标签: c# asp.net json asp.net-web-api

有这个对象:

public class Person {
    public string FirstName { get; set; }
    [DataType(DataType.Date)]
    public DateTime Birthday { get; set; }
}

返回此对象,因为Web Api 2中的内容会为Birthday生成此json:

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

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

5 个答案:

答案 0 :(得分:5)

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

var p = JsonConvert.DeserializeObject<Person>(json,new ShortDateConverter());

或使用[JsonConverter(typeof(ShortDateConverter))]

装饰您的字段

并使用

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

var p = JsonConvert.DeserializeObject<Person>(json);

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"));
    }
}

答案 1 :(得分:4)

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

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

public class Foo
{
    [JsonConverter(typeof(IsoDateConverter))]
    public DateTimeOffset Date { get; set; }
}

答案 2 :(得分:3)

怎么样:

public class Person 
{
    public string FirstName { get; set; }

    [JsonIgnore]
    public DateTime Birthday { get; set; }

    public string Birthdate 
    {
        get { return Birthday.ToShortDateString(); }   
        set {}     
    }
}

编辑:在Habibs发表评论后,我将其更改为ToShortDateString。如果您想要另一个转换,可以使用ToString格式 - 重载。

这取决于你是否需要双向的整个事物。不确定是否需要空的二传手,但我有点想到这一点。

另一种选择可能是直接使用Json.NET序列化程序,它可以让您更好地了解正在发生的事情,包括控制DateTime等。

答案 3 :(得分:2)

对于.NET core 3.* API

public class ShortDateConverter : JsonConverter<DateTime>
{
    public override DateTime Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options)
    {
        // only supports writing
        throw new NotImplementedException();
    }

    public override void Write(
        Utf8JsonWriter writer,
        DateTime value,
        JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
    }
}

并在Startup.cs的{​​{1}}中注册:

ConfigureServices

答案 4 :(得分:0)

您应该使用代理属性进行序列化,并将实际属性标记为不可序列化: Can you specify format for XmlSerialization of a datetime?