2009-03-21 27 views
33

मैंने किसी चीज़ Newtonsoft के JSON serializer का उपयोग कर धारावाहिक है, और दिनांक समय के रूप में के माध्यम से आ गया है:पार्सिंग JSON दिनांक समय

/Date(1237588418563+0000)/ 

जब मैं $ .evalJSON() उस पर, यह एक वस्तु है लेकिन मुझे किसी भी सामान्य दिनांक विधियों को नहीं मिल रहा है जैसे कि TOUTCString।

कोई भी विचार क्या मैं इस के साथ कर सकते हैं?

+0

लिए काम करता है संदर्भ के लिए के लिए आप ?: http://www.tek-tips.com/viewthread.cfm?qid=1526126&page=8 – bernie

उत्तर

77

उपयोग JsonConverters कि तारीखों के साथ काम करने के लिए एक बेहतर प्रारूप पाने के लिए Json.NET के साथ आते हैं में से एक। जावास्क्रिप्टडेटाइम कनवर्टर स्वचालित रूप से आपको एक जावास्क्रिप्ट दिनांक देगा।

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"}  
} 

प्रलेखन: Serializing Dates in JSON with Json.NET

+4

इस काम करता है, IsoDateTimeConverter पर नाम स्थान Newtonsoft है। Json.Converters और JsonConvert.SerializeObject पर यह Newtonsoft.Json –

2

एडम से लिंक के आधार पर एक ही समस्या में पड़ गए, और पाया एक समाधान:

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

यह एक यूनिक्स टाइमस्टैम्प, जो जावास्क्रिप्ट आसानी से सक्षम है की तरह लग रहा एक तिथि वस्तु में बदलने के लिए। - 0 जावास्क्रिप्ट एक पूर्णांक के रूप में substr उत्पादन का इलाज करने के लिए बस है ... मुझे लगता है कि आप इसे के रूप में अच्छी Number() सकता है, यदि आप - 0

1

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

लेकिन, अभी भी जेएसओएन ऑब्जेक्ट को ठीक करना बेहतर होगा ताकि डेट फ़ंक्शन eval() या window [] जैसे कुछ का उपयोग किए बिना निकाल दिया गया हो। शायद jQuery में। निश्चित नहीं।

यह भूलना न भूलें कि ऑफसेट + हो सकता है और ऑफ़सेट के लिए केवल - नहीं हो सकता है!

+0

आप भी एक regex का उपयोग है और उसके बाद इस तरह पाठ eval: 'eval (" नया "+ data.CreateDate.replace (/ \ // ig," ")) ' काम करने के लिए ठीक –

15

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 सेट हो जाएगा के रूप में।

+0

यह जवाब है लगता है सबसे अप-टू-डेट –

+1

मुझे नहीं लगता है कि मैं समझ रहा हूँ कि क्या यह करने के लिए माना जाता है, या यह कैसे काम चाहिए था है। मेरी कक्षा पर, मैं इस है: [JsonProperty (ItemConverterType = typeof (IsoDateTimeConverter))] सार्वजनिक System.DateTime RecordInsertedDate {मिल; सेट; } लेकिन मेरे दिनांकों अभी भी, मैं ServiceStack जो इस अधिभावी था उपयोग कर रहा था के रूप में डिफ़ॉल्ट/तारीख (132456560000000)/प्रारूप –

+0

NVM के माध्यम से आ रहे हैं। आपको ServiceStack के JsConfig.DateHandler = DateHandler.ISO8601 का उपयोग करना होगा; ISO8601 –

14

मैं एक अलग दृष्टिकोण है जो किसी के लिए उपयोगी हो सकता है के साथ आया था। असल में मैं अपना खुद का कस्टमडेट कनवर्टर बनाता हूं जिसे मुझे इसकी आवश्यकता होने पर कॉल करता है। कनवर्टर 2 पैरामीटर लेता है, एक दिनांक प्रारूप उदा। yyyy-MM-dd HH:mm:ss और एक TimeZoneInfo, मुझे उपयोगकर्ता के समय क्षेत्र के यूटीसी से तारीख कन्वर्ट करने के लिए अनुमति देता है जो:

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

जाहिर है आप समय क्षेत्र से संबंधित कुछ को दूर कर सकता है अगर आप केवल कस्टम डेट स्वरूपण चाहते हैं। मुझे यह जानने में मदद मिली!

+2

प्राप्त करने के लिए अपने कोड में कॉन्फ़िगरेशन सेटिंग अंत में एक सामान्य ओवरराइड नमूना मिला :) बहुत बहुत धन्यवाद – povilasp

+0

यदि कोई इसे वैश्विक रूप से Asp.Net MVC.ervervices पर पंजीकृत कर रहा है। AddMvc() .ddJsonOptions (jsonOption => { jsonOption.SerializerSettings.Converters.Add ( नई JSONCustomDateConverter ("dd/mm/yyy", TimeZoneInfo.FindSystemTimeZoneById ("भारतीय मानक समय"))); }); ' –

0

माफ करना, मैं @James न्यूटन-राजा

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

ObjectMapper नक्शाकार = नए ObjectMapper() थोड़ा आसान बनाने;

mapper.registerModule (नई JavaTimeModule());

mapper.configure (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, झूठी);

यह मैं

संबंधित मुद्दे