जावास्क्रिप्ट में डेट ऑब्जेक्ट प्राप्त करने के लिए JSON को पार्स कैसे करें?


117

मेरे पास JSON का निम्नलिखित भाग है:

\/Date(1293034567877)\/

जो इस .NET कोड का एक परिणाम है:

var obj = DateTime.Now;
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.Serialize(obj).Dump();

अब मैं जिस समस्या का सामना कर रहा हूं, वह यह है कि जावास्क्रिप्ट में डेट ऑब्जेक्ट कैसे बनाया जाए। सभी मैं पा सकता था अविश्वसनीय रेगेक्स समाधान (कई कीड़े युक्त)।

यह मानना ​​मुश्किल है कि कोई भी सुंदर समाधान नहीं है क्योंकि यह सब JavaScrip में है, मेरा मतलब है कि जावास्क्रिप्ट कोड JSON (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन) को पढ़ने की कोशिश कर रहा है, जिसे जावास्क्रिप्ट कोड माना जाता है और इस समय यह पता चलता है कि यह जावास्क्रिप्ट का कारण नहीं बन सकता है। यहां अच्छा काम करो।

मैंने कुछ स्पष्ट समाधान भी देखे हैं, जिन्हें मैं काम नहीं कर पाया (सुरक्षा खतरे के रूप में इंगित किया गया है)।

क्या वास्तव में इसे सुरुचिपूर्ण तरीके से करने का कोई तरीका नहीं है?

बिना किसी वास्तविक उत्तर के समान प्रश्न:
GWT के साथ ASP.NET JSON दिनांक प्रारूप को पार्स कैसे करें


2
आप बस क्लाइंट को टाइमस्टैम्प पास कर सकते हैं और new Date()उस पर कॉल कर सकते हैं।
jAndy

अगर मेरे पास टाइमस्टैम्प था, लेकिन मेरे पास JSON है जिसे जावास्क्रिप्ट स्पष्ट रूप से नहीं समझता है [sic!]
Piotr Owsiak

जवाबों:


51

तारीखों का कोई मानक JSON प्रतिनिधित्व नहीं है। आपको वह करना चाहिए जो @jAndy ने सुझाया हो और बिल्कुल भी सीरियल न करें DateTime; बस एक RFC 1123 तारीख स्ट्रिंग ToString("r")या एक सेकंड-यूनिक्स-एपोच नंबर भेजें , या कुछ और जिसे आप जावास्क्रिप्ट में उपयोग कर सकते हैं निर्माण करने के लिए Date


3
धन्यवाद मैं एक मृत रास्ते से नीचे जा रहा था, आप पहली बार इंगित करने वाले थे कि JSON दिनांक प्रकार का समर्थन नहीं करता है।
पियोट्र ओविसक

3
JSON संख्याओं, तारों, वस्तुओं, सरणियों और शाब्दिकों को सही, गलत और शून्य का समर्थन करता है। चूंकि तिथि उनमें से कोई नहीं है, यह एक जटिल प्रकार है जिसे एक स्ट्रिंग के बजाय एक वस्तु के रूप में संग्रहीत किया जाना चाहिए, इसलिए आप विशेष प्रकार के सदस्यों जैसे "$ प्रकार" जैसे प्रकार की जानकारी शामिल कर सकते हैं जो कभी भी हल नहीं होगी वास्तविक वस्तु सदस्य। ऐसे मेटा-सदस्यों का उपयोग JSON ऑब्जेक्ट को बाद में एक दृढ़ता से टाइप किए गए रनटाइम ऑब्जेक्ट को पुनर्जीवित करने के लिए किया जा सकता है। मुझे लगता है कि एक तार में एक तारीख को चिपकाने की प्रथा बेवकूफी है, क्योंकि यह अनावश्यक रूप से आरक्षित स्ट्रिंग पैटर्न बनाता है और उन्हें हर स्ट्रिंग पर मिलान करने की कोशिश करता है।
२३:३१ बजे त्रिकोको

4
अब एक मानक JSON दिनांक प्रारूप है। tools.ietf.org/html/rfc7493#section-4.3
ब्रायन लार्सन

128

JSON.parseसमारोह एक वैकल्पिक दिनांक समय फिर से जीवित करनेवाला समारोह स्वीकार करता है। आप इस तरह एक समारोह का उपयोग कर सकते हैं:

dateTimeReviver = function (key, value) {
    var a;
    if (typeof value === 'string') {
        a = /\/Date\((\d*)\)\//.exec(value);
        if (a) {
            return new Date(+a[1]);
        }
    }
    return value;
}

फिर कॉल करो

JSON.parse(somejsonstring, dateTimeReviver);

और आपकी डेट सही निकलेगी।


1
अच्छी तरह से देखा, काफी उपयोगी है।
21

5
एक आदिम प्रकार (स्ट्रिंग) में गैर-आदिम टाइप किए गए डेटा को एन्कोड करने की यह प्रथा पागल है। सार्थक गुणों के साथ JSON ऑब्जेक्ट में दिनांक एन्कोड करें, या इससे भी आगे जाने के लिए, JSON ऑब्जेक्ट में एक "$ प्रकार" गुण शामिल करें, ताकि पार्स / डिसेरिएलाइज़ रूटीन प्रकार को उचित रूप से पुनर्जीवित कर सकें और कस्टम कन्वर्टर्स का उपयोग कर सकें, जिन्हें आप सभी को पैक करना चाहते हैं। "टिक" या "ms_since_epoch" जैसे एकल गुण मान में जानकारी।
त्रिकोको

7
मुझे इस / \ / Date (- (?! D *)) \ // जैसे regex को संशोधित करना था ताकि यह नकारात्मक संख्याओं को भी संभाल सके। नकारात्मक संख्या तब दिखाई देती है जब आपके पास एक बहुत पुराना DateTime (एपोक से पहले) जो .NET द्वारा JSON में परिवर्तित किया गया था।
क्लियरक्लाउड 8

@ ClearCloud8: आप वापस स्लैश याद करते हैं: / \ / Date \
_

1
मुझे इस फ़ंक्शन के बारे में कभी नहीं पता था - यह इतना उपयोगी है!
केदार

50

रॉय टिंकर का यह जवाब यहां :

var date = new Date(parseInt(jsonDate.substr(6)));

जैसा कि वह कहता है: रूट फ़ंक्शन "/ दिनांक (" भाग को बाहर निकालता है, और पार्सइंट फ़ंक्शन पूर्णांक प्राप्त करता है और अंत में ") /" को अनदेखा करता है। परिणामी संख्या को डेट कंस्ट्रक्टर में पारित किया जाता है।

एक अन्य विकल्प यह है कि आप अपनी जानकारी को एएसपी की तरफ ठीक से प्रारूपित करें, ताकि जावास्क्रिप्ट आसानी से पढ़ सके। अपनी तिथियों के लिए ऐसा करने पर विचार करें:

DateTime.Now()

जो इस तरह एक प्रारूप वापस करना चाहिए:

7/22/2008 12:11:04 PM

यदि आप इसे इस Dateतरह जावास्क्रिप्ट निर्माता में पास करते हैं :

var date = new Date('7/22/2008 12:11:04 PM');

चर dateअब यह मान रखता है:

Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time)

स्वाभाविक रूप से, आप इस DateTimeऑब्जेक्ट को जेएस Dateकंस्ट्रक्टर को स्वीकार करने वाले स्ट्रिंग / इंट के किसी भी प्रकार में प्रारूपित कर सकते हैं ।


धन्यवाद ट्रीफेस, इस जवाब ने मुझे हाल ही में कुछ के साथ मदद की!
मालिस

4
कभी भी, कभी भी, डिफ़ॉल्ट तिथि पर निर्भर न करें <-> स्ट्रिंग रूपांतरण प्रारूप। युग के बाद से मिलीसेकंड का उपयोग करना, जो संख्यात्मक-प्रकार के डोमेन में रहता है, कहीं अधिक सरल और विश्वसनीय है।
जोहान बोउले

2
यह उत्तर दो समाधान प्रस्तुत करता है - पहला सही (पार्सेइंट) और दूसरा एक गलत, इसलिए सुनिश्चित नहीं करना चाहिए कि क्या अपवोट या डाउनवोट है! बस एक स्ट्रिंग के रूप में आउटपुट के साथ समस्या यह है कि यह तिथि आसानी से पीछे की तरफ फ्लिप कर सकती है यदि सर्वर एक देश में है जैसे यूएस और दूसरे यूके में ब्राउज़र।
माइक नेल्सन

मुझे किसी भी तरह का सुराग देने का पहला जवाब
Nick.McD मत्स्यांगना

" अपनी तिथियों के लिए ऐसा करने पर विचार करें ... " तक एक ठीक उत्तर । एक गैर-मानक प्रारूप का सुझाव देना जो कार्यान्वयन पर निर्भर पार्सिंग और टाइमज़ोन मुद्दों का परिचय देता है, एक अच्छा विचार नहीं है। ओपी प्रारूप बेहतर है (हालांकि आदर्श नहीं)।
रॉबजी

21

यदि आप JSON में जावास्क्रिप्ट शैली ISO8601 दिनांक का उपयोग करते हैं, तो आप MDN से, इसका उपयोग कर सकते हैं

var jsonDate = (new Date()).toJSON();
var backToDate = new Date(jsonDate);
console.log(jsonDate); //2015-10-26T07:46:36.611Z

2
imo यह सबसे सुरुचिपूर्ण उत्तर है और इसे स्वीकार किया जाना चाहिए।
जॉन

1
वास्तव में बहुत सुंदर है, लेकिन यह उस विशिष्ट तिथि प्रारूप से संबंधित नहीं है जिसका उल्लेख प्रश्न में किया गया था।
asiop

@aslop - यदि उपयोगकर्ता ISO से / के लिए कोई दिनांक परिवर्तित नहीं कर सकता है, तो JSON समस्याओं का कम से कम है।
लीगी

7

आप जावास्क्रिप्ट में सामान्य तिथि प्रारूप में JSON दिनांक को बदल सकते हैं।

var date = new Date(parseInt(jsonDate.substr(6)));

6

क्या गलत है:

new Date(1293034567877);

यह मेरे लिए "बुध दिसंबर 22 2010 16:16:07 GMT + 0000 (GMT मानक समय)" है।

या क्या आपको नंबर को जसन से बाहर निकालने की आवश्यकता है?


3
आपके समाधान में क्या गलत है? खैर 1293034567877 JSON मेरे पास नहीं है, है ना? इसके अलावा, मुझे JSON से नंबर प्राप्त करने की आवश्यकता नहीं है, मुझे JSON से दिनांक प्राप्त करने की आवश्यकता है। मैं जावास्क्रिप्ट से थोड़ी अधिक उम्मीद कर रहा हूं कि केवल रेगेक्स के साथ सब कुछ करने में सक्षम हूं। मुझे अपने कोड को पठनीय होना चाहिए और कार्टून शाप की तरह नहीं दिखना चाहिए।
पायोत्र ओविसक

7
मैं एक प्रारूप में किसी दिनांक वस्तु के क्रमांकन को अजीब के रूप में बनाने के लिए .NET को दोष देता हूँ \/Date(1293034567877)\/। यदि यह समझदार था, तो यह समय के अनुसार उत्पादन करेगा और आप इसके साथ दिनांक ऑब्जेक्ट को इनिशियलाइज़ कर सकते हैं।
क्वेंटिन

2
@treeface: अगर JSON जावास्क्रिप्ट नहीं है, तो मुझे लगता है कि इस सामान्य गलतफहमी के लिए ट्यूटोरियल और पुस्तकों को दोषी ठहराया जाना है। वैसे भी मैं ख़ुशी से सही, सच में खड़ा हूँ। आपके सुझाव के अनुसार कि तारीख को स्ट्रिंग के रूप में दर्शाया जा सकता है मैं कह सकता हूं कि सब कुछ स्ट्रिंग के रूप में प्रतिनिधित्व किया जा सकता है, है ना? लेकिन इससे हमारा काम आसान नहीं होगा, बल्कि बहुत दर्दनाक और नारकीय हो जाएगा। मुझे लगता है कि मेरी समस्या इस तथ्य से उपजी है कि मैंने JSON को एक क्रमांकन प्रारूप के रूप में माना (कम बैंडविड्थ लेने और एक्सएमएल की तुलना में जावास्क्रिप्ट के साथ बेहतर काम करने के लिए विज्ञापित)। जैसा कि यह पता चला है कि यह कम से कम दर्द रहित नहीं है।
पियोट्र ओवियाक

1
@treeface: मैंने JSON के बारे में आपका दावा Google किया और पता चला कि JSON जावास्क्रिप्ट है, वास्तव में यह जावास्क्रिप्ट का सबसेट है। RFC # 4627 "जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON)" के लिए एप्लिकेशन / json मीडिया टाइप देखें और एक स्टेटमेंट देखें: "JSON के डिजाइन लक्ष्य इसके लिए न्यूनतम, पोर्टेबल, टेक्स्ट और जावास्क्रिप्ट का सबसेट थे।" अब जब मैं इसके बारे में सोचता हूं, तो यह स्पष्ट लगता है कि आप JSON पर eval () कॉल कर सकते हैं।
पियोट्र ओवियाक

1
@ डेविड डोरवर्ड: मैं यह चाहूंगा कि जोड़ा गया जटिलता पुस्तकालयों के अंदर गहराई से लागू किया जाए। यह भी ध्यान दें कि आपको JSON में बूलियन और पूर्णांक डेटा प्रकार के समर्थन की आवश्यकता नहीं है, आप बस उन्हें स्ट्रिंग्स में डाल सकते हैं, है ना? क्या आप सोच सकते हैं कि जेएसएन से किसी भी तरह का मिलना कितना अजीब होगा?
पियोट्र ओवियाक

2

मुझे पता है कि यह एक बहुत पुराना धागा है, लेकिन मैं इसे पोस्ट करने की इच्छा रखता हूं जो इस तरह से टकराते हैं जैसे मैंने किया था।

यदि आप एक 3 पार्टी स्क्रिप्ट का उपयोग करने के बारे में परवाह नहीं करते हैं, तो आप क्षण, js का उपयोग कर सकते हैं। तब आप इसे (आप कुछ भी चाहते हैं) को प्रारूपित करने के लिए .format () का उपयोग कर सकते हैं।


2

तिथियां हमेशा एक बुरा सपना होती हैं। अपने पुराने प्रश्न का उत्तर देना, शायद यह सबसे सुंदर तरीका है:

eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))

Eval के साथ हम अपने स्ट्रिंग को जावास्क्रिप्ट कोड में बदलते हैं। फिर हम "/" को हटाते हैं, प्रतिस्थापित फ़ंक्शन में एक नियमित अभिव्यक्ति है। जैसा कि हम नए के साथ शुरू करते हैं तो हमारे वाक्य इसे समाप्त कर देंगे:

new Date(1455418800000)

अब, एक चीज जो मैंने बहुत पहले इस्तेमाल करना शुरू किया था, वह है लंबे मूल्य जो टिक्सेस में दर्शाए जाते हैं ... क्यों? हर सर्वर या हर क्लाइंट में तारीख को कैसे कॉन्फ़िगर किया जाता है, यह अच्छी तरह से, स्थानीयकरण और सोचना बंद कर दें। वास्तव में, मैं इसका उपयोग डेटाबेस में भी करता हूं।

शायद इस उत्तर के लिए काफी देर हो चुकी है, लेकिन यहां किसी को भी घेरने में मदद मिल सकती है।


Btw, वर्षों के साथ मेरी अंग्रेजी पहले से कहीं ज्यादा खराब हो रही है ... लेकिन मुझे लगता है कि मैंने अपने आप को समझा।
गैब्रियल आंद्रेस ब्रानकोलिनी

आपका जवाब बहुत काम करता है, मुझे जाम से निकालने में मदद की। धन्यवाद।
21

1

AngularJS .NET JSON दिनांक /Date(xxxxxxxxxxxxx)/स्ट्रिंग या तो पार्स नहीं कर सकता है ..

मैंने इस मुद्दे को Dateसीधे अपने आईएसओ 8601 स्ट्रिंग प्रतिनिधित्व के लिए दिनांक स्वरूपित करके इस मुद्दे को आगे बढ़ाया, बजाय सीधे वस्तु को डंप करने के ...

यहाँ ASP.NET MVC कोड का एक नमूना है ..

return Json(new { 
  date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format
});

मैंने कोशिश की, RFC 1123लेकिन यह काम नहीं करता है .. कोणीय तारीख के बजाय इसे स्ट्रिंग के रूप में मानता है।

return Json(new { 
  date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this
});

0

मैंने इस तरह की चीजों के लिए .Net का उपयोग नहीं किया है। यदि आप इसे प्राप्त करने में सक्षम थे, तो निम्नलिखित में से कुछ ऐसा प्रिंट करना चाहिए जैसे यह काम करना चाहिए।

ध्यान दें, जब तक आप उस JSON स्ट्रिंग को किसी अन्य माध्यम से पार्स नहीं कर रहे हैं या केवल उपयोगकर्ताओं से यह उम्मीद करते हैं कि JSON पार्सर में निर्मित आधुनिक ब्राउजर के साथ आपको जेएस फ्रेमवर्क या JSON2 का उपयोग करने की आवश्यकता है, JSON स्ट्रिंग को सर्वर द्वारा वास्तविक JSON में आउटपुट करने के लिए पार्स करें वस्तु।

// JSON received from server is in string format
var jsonString = '{"date":1251877601000}';

//use JSON2 or some JS library to parse the string
var jsonObject =  JSON.parse( jsonString );

//now you have your date!
alert( new Date(jsonObject.date) );

विकी लिंक

फ़ायरफ़ॉक्स 3.5 और इंटरनेट एक्सप्लोरर 8 जैसे आधुनिक ब्राउज़र में JSON को पार्स करने के लिए विशेष सुविधाएँ शामिल हैं। चूंकि देशी ब्राउज़र समर्थन eval () की तुलना में अधिक कुशल और सुरक्षित है, इसलिए यह अपेक्षित है कि देशी JSON समर्थन अगले ECMAScript मानक में शामिल किया जाएगा। [६]


JSON2 फ़ाइल से लिंक करें

लाइव उदाहरण


मुझे यह मिल गया है, लेकिन JSON और दिनांक प्रकार के साथ मेरा मुद्दा यह है कि मुझे स्पष्ट रूप से "नई तिथि (" जो कि एक अतिरिक्त काम है) अतिरिक्त ज्ञान का टुकड़ा है जिसे उपभोक्ता को सूचित करने की आवश्यकता है। मैं वास्तव में यह पता लगाने के लिए निराश हूं कि यह कैसे संभाला जाता है और मैं इसे तर्कसंगत रूप से JSON कल्पना में एक गलती मानता हूं।
पियोट्र ओविसक

0

इस सवाल का जवाब है, JSON.NET प्राप्त करने के लिए nuget का उपयोग करें और फिर इसे अपने JsonResultतरीके के अंदर उपयोग करें :

JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */);

आपके विचार में यह सरल है javascript:

JSON.parse(/* Converted JSON object */)

यदि यह अजाक्स कॉल है:

var request = $.ajax({ url: "@Url.Action("SomeAjaxAction", "SomeController")", dataType: "json"});
request.done(function (data, result) { var safe = JSON.parse(data); var date = new Date(safe.date); });

एक बार JSON.parseकॉल करने के बाद, आप JSON दिनांक को एक new Dateउदाहरण में रख सकते हैं क्योंकि JsonConvertएक उचित ISO समय आवृत्ति बनाता है


0
function parseJsonDate(jsonDate) {

    var fullDate = new Date(parseInt(jsonDate.substr(6)));
    var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth;

    var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate;
    var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear();

    return currentDate;
};

0

जैसा कि कैलम ने उल्लेख किया है, मेरे लिए सबसे अच्छा तरीका है कि JsonResult के बजाय नियंत्रक विधि को स्ट्रिंग में बदला जाए।

public string GetValues()
{
  MyObject.DateFrom = DateTime.Now;
  return JsonConvert.SerializeObject(MyObject);
}

अजाक्स विधि से आप ऐसा कुछ कर सकते हैं

 $.ajax({
 url: "/MyController/GetValues",
 type: "post",
 success: function (data) {
 var validData = JSON.parse(data);
//if you are using datepicker and you want set a format
$("#DateFrom").val($.datepicker.formatDate("dd/mm/yy", new Date(validData.DateFrom)));                                      
// if you want the date as returned
$("#DateFrom").val(new Date(validData.DateFrom))
}
});

0

eval function काम का उपयोग करते हुए बस आगे और पीछे के स्लैश को हटाना है।

var date1 = "/Date(25200000)/"
eval("new " + date1.substring(1, date1.length - 1));

पैदावार थीउ जनवरी 01 1970 00:00:00 GMT-0700 (यूएस माउंटेन स्टैंडर्ड टाइम)


0

मैं इस प्रारूप में तारीखों को प्रदान करने वाले बाहरी एपीआई के साथ एक समस्या में भाग गया, कुछ समय यूटीसी अंतर जानकारी के साथ भी /Date(123232313131+1000)/। मैं Dateनिम्नलिखित कोड के साथ इसे js ऑब्जेक्ट चालू करने में सक्षम था

var val = '/Date(123232311-1000)/';
var pattern = /^\/Date\([0-9]+((\+|\-)[0-9]+)?\)\/$/;
var date = null;

// Check that the value matches /Date(123232311-1000)/ format
if (pattern.test(val)) {
  var number = val.replace('/Date(', '',).replace(')/', '');
  if (number.indexOf('+') >= 0) {
    var split = number.split('+');
    number = parseInt(split[0]) + parseInt(split[1]);
  } else if (number.indexOf('-') >= 0) {
    var split = number.split('-');
    number = parseInt(split[0]) - parseInt(split[1]);
  } else {
    number = parseInt(number);
    date = new Date(number);
  }
}

-1
//
// formats a .net date into a javascript compatible date
//
function FormatJsonDate(jsonDt) 
{              
    var MIN_DATE = -62135578800000; // const

    var date = new Date(parseInt(jsonDt.substr(6, jsonDt.length-8)));                                                       
    return date.toString() == new Date(MIN_DATE).toString() ? "" : (date.getMonth() + 1) + "\\" + date.getDate() + "\\" + date.getFullYear(); 
}

2
आप एक दिनांक ऑब्जेक्ट नहीं लौटा रहे हैं, जहां तक ​​मैं कोड समझता हूं।
जोहान बोउले

-1
function parseJsonDate(jsonDate) {

    var fullDate = new Date(parseInt(jsonDate.substr(6)));
    var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth;

    var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate;
    var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear();

    return currentDate;
};

// इस फ़ंक्शन का उपयोग करें

var objDate=parseJsonDate("\/Date(1443812400000)\/");
alert(objDate);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.