有这个对象:
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"
?
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"));
}
}
到目前为止,最简单的方法是子类化内置的IsoDateTimeConverter
类并设置不同的DateTimeFormat
。
public class IsoDateConverter : IsoDateTimeConverter
{
public IsoDateConverter() =>
this.DateTimeFormat = Culture.DateTimeFormat.ShortDatePattern;
}
public class Foo
{
[JsonConverter(typeof(IsoDateConverter))]
public DateTimeOffset Date { get; set; }
}
关于什么:
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等。
您应该使用代理属性进行序列化,并将实际属性标记为不可序列化:Can you specify format for XmlSerialization of a datetime?