我使用Newtonsoft的JSON序列化程序序列化了一个对象,并且DateTime已经通过:
/Date(1237588418563+0000)/
当我使用$ .evalJSON()时,它是一个对象,但是我找不到像toUTCString这样的普通Date方法.
我有什么想法可以做到这一点?
使用Json.NET附带的JsonConverters之一来处理日期以获得更好的格式.JavaScriptDateTimeConverter会自动为您提供JavaScript日期.
public class LogEntry { public string Details { get; set; } public DateTime LogDate { get; set; } } [Test] public void WriteJsonDates() { LogEntry entry = new LogEntry { LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc), Details = "Application started." }; string defaultJson = JsonConvert.SerializeObject(entry); // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"} string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter()); // {"Details":"Application started.","LogDate":new Date(1234656000000)} string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter()); // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"} }
文档:使用Json.NET在JSON中序列化日期
我提出了一种可能对某些人有用的不同方法.基本上我创建自己的CustomDateConverter,我需要它时调用它.转换器有2个参数,一个日期格式,例如yyyy-MM-dd HH:mm:ss
TimeZoneInfo,它允许我将日期从UTC转换为用户的时区:
public class JSONCustomDateConverter : DateTimeConverterBase { private TimeZoneInfo _timeZoneInfo; private string _dateFormat; public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo) { _dateFormat = dateFormat; _timeZoneInfo = timeZoneInfo; } public override bool CanConvert(Type objectType) { return objectType == typeof(DateTime); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat)); writer.Flush(); }
你可以像这样使用它:
var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });
如果您只想要自定义日期格式,显然您可以删除与时区相关的任何内容.让我知道它有帮助!
从Newtonsoft Json.Net版本4.5r5开始,您使用JsonPropertyAttribute类并设置其ItemConverterType属性.用法:
// class to be serialized public class MyClass { [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))] public DateTime? DateTime1; public DateTime? DateTime2; }
正如我所观察到的,这将为此类中的所有属性设置DateTimeConverter,而不仅仅是声明之前的属性.