从Newtonsoft的JSON序列化程序parsingJSON DateTime

我已经使用Newtonsoft的JSON序列化程序序列化了一个对象,并且DateTime已经通过:

/Date(1237588418563+0000)/ 

当我$ .evalJSON()就是这样,它是一个对象,但我找不到任何正常的date方法,如toUTCString就可以了。

任何想法我可以用这个做什么?

使用Json.NET附带的一个JsonConverters处理date以获得更好的格式。 JavaScriptDateTimeConverter会自动给你一个JavaScriptdate。

 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中序列化date

从Newtonsoft Json.Net版本4.5r5开始,您使用JsonPropertyAttribute Class类并设置其ItemConverterType属性。 用法:

 // class to be serialized public class MyClass { [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))] public DateTime? DateTime1; public DateTime? DateTime2; } 

正如我所观察到的,这将为此类中的所有属性设置DateTimeConverter,而不仅仅是之前声明的那个属性。

我想出了一个可能对某些人有用的不同方法。 基本上我创build了我自己的CustomDateConverter ,当我需要的时候调用它。 转换器需要2个参数,一个date格式,例如yyyy-MM-dd HH:mm:ss和一个TimeZoneInfo,它允许我将UTC的date转换为用户的时区:

 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<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } }); 

显然你可以删除任何与时区有关的东西,如果你只想自定义date格式。 让我知道这有帮助!

跑到同样的问题,并find一个解决scheme基于从亚当的链接:

 new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0)); 

它看起来像一个Unix时间戳,这个javascript很容易转换成date对象。 - 0只是简单地把JavaScript的substr输出作为一个整数…我想你也可以Number()它,如果你不喜欢的外观- 0

JSON对象包含这样的东西:

 var data = {"CreatedDate":"/Date(1327572000000-1000)/"}); /// var oddDateTimeZone = data.CreatedDate; var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13); var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4); var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone))); 

但是,仍然最好修复JSON对象,以便在不使用eval()或window []之类的情况下触发date函数。 也许在jQuery中。 不确定。

不要忘记,抵消可能是+而不仅仅是-抵消!

对不起,我简化了一下@James Newton-King

 string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now); 

ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);

这对我有用