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

问题描述 投票:0回答:4

有这个对象:

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

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

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

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

c# asp.net json asp.net-web-api
4个回答
6
投票
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"));
    }
}

5
投票

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

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

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

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等。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.