2009-03-21 32 views
33

Tôi đã đăng một đối tượng sử dụng JSON serializer Newtonsoft, và các DateTime đã đi qua như:Parsing JSON DateTime từ JSON Serializer Newtonsoft của

/Date(1237588418563+0000)/ 

Khi tôi $ .evalJSON() trên đó, nó là một đối tượng nhưng tôi không thể tìm thấy bất kỳ phương thức Date bình thường nào như toUTCString trên đó.

Bất kỳ ý tưởng nào tôi có thể làm với điều này?

+0

Liệu tác phẩm này với bạn ?: http://www.tek-tips.com/viewthread.cfm?qid=1526126&page=8 – bernie

Trả lời

77

Sử dụng một trong các JsonConverters đi kèm với Json.NET để làm việc với các ngày để có định dạng tốt hơn. JavaScriptDateTimeConverter sẽ tự động cung cấp cho bạn một ngày 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"}  
} 

Tài liệu: Serializing Dates in JSON with Json.NET

+4

Để tham khảo, không gian tên trên IsoDateTimeConverter là Newtonsoft. Json.Converters và trên JsonConvert.SerializeObject nó là Newtonsoft.Json –

2

Ran vào cùng một vấn đề, và tìm thấy một giải pháp dựa trên các liên kết từ Adam:

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

Nó trông giống như một dấu thời gian Unix, mà javascript là dễ dàng có thể để chuyển đổi thành đối tượng ngày tháng. Các - 0 chỉ đơn giản là làm cho javascript trị sản lượng substr là một số nguyên ... Tôi đoán bạn có thể Number() nó là tốt, nếu bạn không thích vẻ của - 0

1

Đối tượng JSON chứa một cái gì đó như thế này:

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))); 

nhưng, vẫn tốt hơn là sửa đối tượng JSON sao cho hàm ngày được kích hoạt mà không sử dụng thứ gì đó như eval() hoặc window []. Có lẽ trong jQuery. Không chắc.

Đừng quên rằng chênh lệch có thể là + và không chỉ - để bù trừ!

+0

bạn cũng sử dụng một regex và sau đó eval văn bản như thế này: 'eval (" new "+ data.CreateDate.replace (/ \ // ig," ")) ' dường như hoạt động tốt –

15

Kể từ Newton Newton Json.Net phiên bản 4.5r5 bạn sử dụng lớp Lớp JsonPropertyAttribute và đặt thuộc tính Thuộc tính ItemConverterType của nó. Cách sử dụng:

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

Như tôi đã quan sát này sẽ thiết lập các DateTimeConverter cho tất cả các thuộc tính trong lớp học này không chỉ là một trước khi được công bố.

+0

Câu trả lời này là cập nhật nhất –

+1

Tôi không nghĩ rằng tôi hiểu điều này được cho là phải làm gì, hoặc nó hoạt động như thế nào. Trên lớp học của tôi, tôi có điều này: [JsonProperty (ItemConverterType = typeof (IsoDateTimeConverter))] Hệ thống công cộng.DateTime RecordInsertedDate {get; bộ; } Nhưng ngày của tôi vẫn được xem như là mặc định/Ngày (132456560000000)/định dạng –

+0

NVM, tôi đã sử dụng ServiceStack đã ghi đè điều này. Bạn phải sử dụng JsConfig.DateHandler của ServiceStack = DateHandler.ISO8601; cấu hình thiết lập trong mã của bạn để có được ISO8601 –

14

Tôi đã đưa ra một cách tiếp cận khác có thể hữu ích đối với một số người. Về cơ bản tôi tạo CustomDateConverter mà tôi gọi khi tôi cần. Trình biến đổi có 2 tham số, định dạng ngày, ví dụ: yyyy-MM-dd HH:mm:ss và TimeZoneInfo, cho phép tôi để chuyển đổi ngày từ UTC tới múi giờ của người dùng:

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(); 
    } 

Bạn có thể sử dụng nó như thế này:

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) } }); 

Rõ ràng, bạn có thể loại bỏ bất cứ điều gì liên quan đến múi giờ nếu bạn chỉ muốn định dạng ngày tùy chỉnh. Hãy cho tôi biết điều đó đã giúp!

+2

Cuối cùng tìm thấy một mẫu ghi đè bình thường :) cảm ơn rất nhiều – povilasp

+0

Nếu ai đó đang tìm cách mở rộng nó bằng cách đăng ký toàn cầu trên Asp.Net MVC.'services.AddMvc() .AddJsonOptions (jsonOption => { jsonOption.SerializerSettings.Converters.Add ( JSONCustomDateConverter mới ("dd/mm/yyy", TimeZoneInfo.FindSystemTimeZoneById ("Giờ chuẩn Ấn Độ")); }); ' –

0

Xin lỗi tôi đơn giản hóa một chút @ James Newton-King

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

ObjectMapper mapper = new ObjectMapper();

mapper.registerModule (new JavaTimeModule());

mapper.configure (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

này làm việc cho tôi

Các vấn đề liên quan