有这个对象:
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"
没有时间部分?
答案 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?