جسون التاريخ والوقت من Newtonsoft هو سلمان مسلسل
سؤال
لقد تسلسل كائن باستخدام Newtonsoft هو سلمان مسلسل و التاريخ والوقت قد حان من خلال:
/Date(1237588418563+0000)/
عندما $.evalJSON() على أنه هو كائن ولكن لا أستطيع أن أجد أي عادي تاريخ أساليب مثل toUTCString على ذلك.
أي أفكار ما يمكنني القيام به مع هذا ؟
المحلول
استخدام واحدة من JsonConverters التي تأتي مع Json.NET العمل مع التواريخ للحصول على أفضل شكل.JavaScriptDateTimeConverter سوف تعطيك تلقائيا جافا سكريبت التاريخ.
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"}
}
نصائح أخرى
وخطرت لي نهجا مختلفا والتي قد تكون مفيدة للبعض. أساسا أنا خلق بلدي <م> 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<JsonConverter>() { 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 لكافة الخصائص في هذه الفئة ليس فقط واحد من قبل والذي أعلن.
وران في نفس المشكلة، والتوصل إلى حل على أساس الارتباط من آدم:
new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));
ويبدو أن الطابع الزمني يونكس، التي جافا سكريبت قادرة بسهولة تحويلها إلى كائن التاريخ. و- 0
هو ببساطة لجعل جافا سكريبت علاج إخراج 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 لذلك أطلقت وظيفة حتى الآن دون استخدام شيء من هذا القبيل وحدة التقييم () أو نافذة []. ربما في مسج. بالتأكيد لا.
ولا ننسى أن الإزاحة يمكن +
وليس فقط -
للتعويض!
وأنا آسف تبسيط قليلاJames نيوتن الملك
string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
وهذا يعمل بالنسبة لي