2012-04-18 12 views
8

पर प्रतिस्थापित करें, हम किसी ऐसे उपयोगकर्ता को कुछ JSON दिखाना चाहते हैं जो हमारे आवेदन का परीक्षण कर रहा हो। इसलिए हम अपनी आरईएसटी सेवा को फाइल के पीछे एएसपी.नेट कोड में कॉल करते हैं और एक स्ट्रिंग लौटाते हैं, जिसमें बहुत सारे JSON होते हैं।एक स्ट्रिंग में एक JSON दिनांक को अधिक पठनीय दिनांक

हम इसे पृष्ठ में एक PRE तत्व में डालते हैं, अच्छे पठनीय JSON बनाने के लिए सुशोभित कॉल करें और सभी अच्छे हैं: मानव पठनीय सामग्री का प्रकार दिखाया गया है।

अच्छा लेकिन एक बात के लिए: सभी तिथियों इस तरह सामान्य JSON प्रारूप में दिखाया जाता है "/ तारीख (1319266795390 + 0800) /"

'सामान्य' के साथ उन लोगों JSON दिनांक की जगह मुझे क्या करना चाहते है JSON (C#) स्ट्रिंग में दिनांक, इसलिए उसके पीछे कोड में, इससे पहले कि मैं PRE तत्व में स्ट्रिंग जोड़ूं।

मैं कुछ regex के बारे में सोच रहा था, लेकिन मैं समझ नहीं सकता कैसे ...

+1

क्या आप अपने प्रश्न के पाठ में JSON स्ट्रिंग का अधिक पूर्ण उदाहरण शामिल कर सकते हैं जिसे आप अधिक "पठनीय" बनाना चाहते हैं। समस्या यह है कि जेएसओएन का इस्तेमाल ज्यादातर क्लाइंट को वेब क्लाइंट में स्थानांतरित करने और JSON को जावास्क्रिप्ट ऑब्जेक्ट में कनवर्ट करने के लिए स्ट्रिंग में बदलने के लिए किया जाएगा। जावास्क्रिप्ट वस्तुओं को पठनीय नहीं होना चाहिए। यदि आपके पास उदाहरण के लिए ऑब्जेक्ट्स के ऐरे हैं जो दिनांक के गुणों के रूप में हैं, तो आप इसे मानव के लिए अच्छी तरह से पठनीय नहीं बना सकते हैं। तो यह समझना महत्वपूर्ण है कि किस प्रकार का डेटा (कौन सा ऑब्जेक्ट) आपने JSON स्ट्रिंग को क्रमबद्ध किया है। – Oleg

+0

क्या आप जावास्क्रिप्ट समाधान पर विचार करेंगे, या आप रूपांतरण करने के लिए सी # का उपयोग करने पर मृत सेट हैं? – jmort253

उत्तर

5

समाधान स्ट्रिंग सवाल में दिखाया गया है के भीतर है। जावास्क्रिप्ट डेट ऑब्जेक्ट उस प्रारूप को पार्स करेगा और एक पठनीय संस्करण तैयार करेगा ताकि Date(1319266795390+0800) रिटर्न "बुध अप्रैल 18 2012 08:13:22 GMT-0500 (सेंट्रल डेलाइट टाइम)"।

स्ट्रिंग से आगे स्लैश हटाने के लिए आप प्रतिस्थापन फ़ंक्शन को नियमित अभिव्यक्ति के साथ उपयोग कर सकते हैं: "/Date(1319266795390+0800)/".replace(/\//g, '')। की तरह regex कुछ के रूप में

+0

आह, लेकिन मेरी स्ट्रिंग में उस तारीख से कहीं अधिक है, इसमें 50 अन्य व्यक्ति गुण हैं जिनमें से कुछ तिथियां हैं। – Michel

+0

मिशेल - नियमित अभिव्यक्ति प्रकृति द्वारा होती है जिसका उद्देश्य विशिष्ट डेटा को बहुत लंबे तारों से पुनर्प्राप्त करना है। एरिक क्या सुझाव दे रहा है आपके लिए काम करना चाहिए पूरी तरह से जावास्क्रिप्ट के साथ किया जा सकता है। – jmort253

1

उपयोग:

(?<= /Date\() 
    (?<ticks>[0-9]+) 
    ((?<zonesign>[+-]) 
    (?<zonehour>[0-9]{2}) 
    (?<zoneminutes>[0-9]{2}) 
)? 
(?= \)/) 

यह /Date(1319266795390+0800)/ के कोष्ठकों के अंदर भाग से मेल खाएगी। इसके बाद आप पूरे JSON स्ट्रिंग पर Regex.Replace कॉल कर सकते हैं के साथ नंबर बदलने के लिए एक ठीक से स्वरूपित DateTime:

, Match वस्तु आप मैच मूल्यांकनकर्ता प्रतिनिधि में मिलता है का उपयोग करें और टिक, zonesign, zonehour और zoneminutes भाग को निकालने इसे करने के लिए परिवर्तित पूर्णांकों।

फिर जावास्क्रिप्ट टिक को .NET ticks (* 10000 होना चाहिए) में परिवर्तित करें, .NET DateTime को टिकों से बाहर बनाएं और समय क्षेत्र के लिए घंटे और मिनट जोड़ें/घटाएं। DateTime को एक स्ट्रिंग में कनवर्ट करें और इसे प्रतिस्थापन के रूप में वापस करें।

1

यदि आपका JSON एक .NET क्लास का क्रमबद्ध प्रतिनिधित्व है, तो हो सकता है कि आप सर्वर पर इसे deserialise करने के लिए DataContractJsonSerializer का उपयोग कर सकें, या शायद आप अपने JSON ऑब्जेक्ट के लिए स्टब क्लास को परिभाषित कर सकते हैं यदि आपको आवश्यकता नहीं है सामान्य समाधान कई डेटासेट को संभालने के लिए:

string json = "{\"Test\": \"This is the content\"}"; 
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(TestJson)); 
var deserialisedContent = ds.ReadObject(new MemoryStream(Encoding.ASCII.GetBytes(json))); 

foreach (var field in typeof (TestJson).GetFields()) 
{ 
    Console.WriteLine("{0}:{1}", field.Name, field.GetValue(deserialisedContent)); 
} 

... 

[DataContract] 
private class TestJson 
{ 
    [DataMember] 
    public string Test; 
} 
13

I'v कुछ समय, उस के लिए there's no standard way और के लिए JSON स्ट्रिंग में दिनांक के साथ काम कर दिया जिसके कारण वहाँ यह करने के लिए इतने सारे अलग अलग तरीकों से कर रहे हैं! शायद यह बेहतर था अगर जेएसओएन विनिर्देश पहली जगहों के लिए मानक प्रारूप निर्दिष्ट कर सकता है!

माइक्रोसॉफ्ट ने अपने अपने तरीके से यह कर रहा है, UTC स्वरूप में 1970 के बाद से msecs गिनती यह है की तरह "/Date(1319266795390+0800)/"

हम कभी ASP.Net JavaScriptSerializer उत्पादन की चोटी पर रेगुलर एक्सप्रेशन का उपयोग के बाद से ISO-8601 format के लिए ऊपर स्ट्रिंग बदल रहे हैं कुछ ।यह एक W3C मानक, मानव पठनीय और जिस तरह से अधिकांश ब्राउज़र को क्रमानुसार स्ट्रिंग के लिए तिथि है, तो यहां देखें:

static readonly long DATE1970_TICKS = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks; 
static readonly Regex DATE_SERIALIZATION_REGEX = new Regex(@"\\/Date\((?<ticks>-?\d+)\)\\/", RegexOptions.Compiled); 

static string ISO8601Serialization(string input) 
{ 
    return DATE_SERIALIZATION_REGEX.Replace(input, match => 
    { 
     var ticks = long.Parse(match.Groups["ticks"].Value) * 10000; 
     return new DateTime(ticks + DATE1970_TICKS).ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fff"); 
    }); 
} 

आप आसानी से प्रारूप बदलने के लिए, आपकी आवश्यकताओं को पूरा कर सकते हैं कस्टम दिनांक और समय स्वरूपों को देखने के लिए check out MSDN article here

यहाँ उसके उपयोग के तरीके:

JavaScriptSerializer ser = new JavaScriptSerializer(); 
var JsonSrt = ISO8601Serialization(ser.Serialize(DateTime.Now)); // "\"2012-05-09T14:51:38.333\"" 

अद्यतन:

वहाँ एक Alte है

var str = "/Date(1319266795390+0800)/"; 
str.replace(/\/Date\((\d+)\+\d+\)\//, function (str, date) { 
    return new Date(Number(date)).toString(); 
}); 
+0

अच्छा समाधान। हम डब्ल्यूसीएफ ढांचे का उपयोग कर रहे हैं जो स्वचालित रूप से वस्तुओं को जेएसओएन में परिवर्तित करता है। कोड में, हम डेटामैम्बर विशेषताओं के साथ एनोटेटेड एक पीओसीओ ऑब्जेक्ट वापस करते हैं, और जब फ़ंक्शन कहा जाता है, तो प्रोजेक्ट प्रकार की प्रकृति के कारण मुझे लगता है कि आउटपुट JSON में परिवर्तित हो जाता है।क्या मैं कहना चाहता हूँ यह है कि (जहाँ तक मुझे पता के रूप में) कोड में कोई पल/जगह है जहाँ मैं कस्टम डेटा में किक कर सकते हैं कोड – Michel

+0

की जगह WCF 'DataContractJsonSerializer' के उपयोग POCO/DataContract वस्तुओं को क्रमानुसार करने में आता है, तो आप कर सकते है डिफ़ॉल्ट JSON serializer tweak, और कस्टम डेटा के साथ 'DataContractJsonSerializer' को प्रतिस्थापित करें! http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/03/wcf-extensibility-message-formatters.aspx किसी भी तरह, वहाँ JSON टेक्स्ट tweak के लिए एक विकल्प है: यहाँ कैसे आप को दिखाने के लिए एक पोस्ट है जावास्क्रिप्ट में रेगेक्स का उपयोग कर सर्वर से लौटाया गया है क्योंकि मैं –

+0

से ऊपर के अपडेट में दिखाऊंगा यह दिनांक (##) के लिए बहुत अच्छा काम करता है लेकिन तारीख (## + ####) यानी कोई टाइमज़ोन जानकारी नहीं है। इस स्ट्रिंग पर ऐसा करने का प्रयास: "{\" एंडटाइम \ ": \" \\/दिनांक (1381479678557) \\/\ ", \" स्टार्टटाइम \ ": \" \\/दिनांक (1381479678557 + 0200) \\/\ "}"। और यह केवल एंडटाइम को प्रतिस्थापित करता है, न कि स्टार्टटाइम – JensB

3

आप इस का उपयोग कर सकते हैं::

string date = "/Date(1319266795390+0800)/"; 
string regex = @"/Date\((.*?)\+(.*?)\)/"; 
Match match = Regex.Match(date, regex); 
DateTime d = new DateTime(1970, 01, 01).AddMilliseconds(long.Parse(match.Result("$1"))); 
1

उपयोग Newtonsoft.JSON JSON स्ट्रिंग बदलाव करने rnative अधिक पठनीय रूप Regex का उपयोग करके करने के लिए जावास्क्रिप्ट में सर्वर से लौट आए। आप अपने स्वयं के धारावाहिक प्रति प्रकार प्रदान कर सकते हैं, और सीरियलाइज तिथियां जो आप चाहते हैं।

http://james.newtonking.com/projects/json-net.aspx

2

लगता वर्ग आप इस तरह दिखता है क्रमानुसार करने हैं:

public class Something 
{ 
    public int ID; 
    public string Name; 
    public DateTime Date; 
} 

परिवर्तन इसे करने के लिए:

public class Something 
    { 
     public int ID; 
     public string Name; 
     public DateTime Date; 
     public string HumanReadableDate { get { return Date.ToLongDateString(); } } 
    } 

या, यदि आपको लगता है कि अतिरिक्त संपत्ति केवल में प्रदर्शित करना चाहते हैं परीक्षण पर्यावरण:

public class Something 
    { 
     public int ID; 
     public string Name; 
     public DateTime Date; 
     #if DEBUG 
     public string HumanReadableDate { get { return Date.ToLongDateString(); } } 
     #endif 
    } 

भी .ToLongDateString() के बजाय आप .ToString("yyyy-MM-dd HH:mm") या किसी अन्य स्वरूप का उपयोग कर सकते हैं

1

उदाहरण dateofbirth के लिए एक स्ट्रिंग संपत्ति मैं यहाँ परिभाषित करने कर रहा हूँ, और के रूप में अपने datetime चर वापसी:

public string DateOfBirthString 
    { 
     get { return DateOfBirth.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss"); } 
     set { DateOfBirth = string.IsNullOrEmpty(value) ? new DateTime(1900, 1, 1) : Convert.ToDateTime(value); } 
    } 

क्योंकि यह वापस आ जाएगी स्ट्रिंग तो यह क्लाइंट साइड पर समान होगा और साथ ही उपयोगकर्ता से स्ट्रिंग डेटटाइम ले लें और इसे कन्वर्ट करें।

0
string input = [yourjsonstring]; 
MatchEvaluator me = new MatchEvaluator(MTListServicePage.MatchDate); 
string json = Regex.Replace(input, "\\\\/\\Date[(](-?\\d+)[)]\\\\/", me, RegexOptions.None) 
संबंधित मुद्दे