سؤال

لقد تسلسل كائن باستخدام 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"}    
}

الوثائق: التسلسلية التواريخ في JSON مع Json.NET

نصائح أخرى

وخطرت لي نهجا مختلفا والتي قد تكون مفيدة للبعض. أساسا أنا خلق بلدي <م> 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);

وهذا يعمل بالنسبة لي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top