2012-02-08 14 views
8
{ id: 1533, 
    story_type_id: 1, 
    content_id: 470, 
    created_at: Sun, 05 Feb 2012 07:02:43 GMT, 
    updated_at: Sun, 05 Feb 2012 07:02:43 GMT, 
    type_name: 'post' } 

मेरे पास ऊपर की तरह "डेटाटाइम" फ़ील्ड के साथ एक JSON ऑब्जेक्ट है। यह एकदम सही है। लेकिन जब मैंने उसे (मैं इसे कैश में संग्रहीत करना चाहते हैं) stringify, मैं इस प्रारूप मिलती है:JSON.stringify क्यों मेरे डेटाटाइम ऑब्जेक्ट को पेंच करता है?

"created_at":"2012-02-05T07:02:43.000Z" 

यह समस्याओं का कारण बनता है, क्योंकि जब मैं इस JSON.parse करना चाहते हैं, अचानक यह अब datetime प्रारूप है और यह संगत नहीं है मेरे अन्य प्रारूप के साथ।

इस समस्या को हल करने के लिए मैं क्या कर सकता हूं? मैंने अपने पूरे एप्लिकेशन में हर जगह 'बनाया_at' बिछाया है। मैं मैन्युअल रूप से प्रत्येक को बदलना नहीं चाहता हूं।

+0

संभवतः आप इन तिथियों को स्थानीय स्टोरेज में स्टोर करने के लिए क्रमबद्ध कर रहे हैं। उस स्थिति में, आप इस तरह के एग्रो से बच सकते हैं और रबू जैसे रैपर लाइब्रेरी का उपयोग कर समान कर सकते हैं। –

उत्तर

13

JSON में Date ऑब्जेक्ट्स को क्रमबद्ध करने का कोई विशेष तरीका नहीं है। यही कारण है कि आप मानकीकृत स्ट्रिंग प्रतिनिधित्व प्राप्त करते हैं। आपको Date कन्स्ट्रक्टर में पास करके उन्हें Date ऑब्जेक्ट्स में वापस कनवर्ट करने की आवश्यकता है।

item['created_at'] = new Date(item['created_at']); 

अद्यतन: reviver समारोह (टिप्पणी देखें) के साथ, आप Date वस्तुओं वापस मिल सकता है।

var item = JSON.parse(row, function (key, value) { 
    if (key === 'created_at') { 
    return new Date(value); 
    } else { 
    return value; 
    } 
}); 
+0

तो इसके बारे में कुछ भी नहीं है? – TIMEX

+0

नहीं, मुझे ऐसा नहीं लगता है। आपको इसे किसी अन्य तरीके से स्टोर करना होगा। –

+0

'दिनांक' वस्तु जावास्क्रिप्ट के मूल निवासी है, लेकिन जेएसओएन एक धारावाहिक तंत्र है जो प्लेटफार्मों के बीच डेटा परिवहन के लिए उपयोग किया जाता है। यदि यह मूल वस्तुओं और कार्यों के क्रमिकरण की अनुमति देता है, जो जेएसओएन से JSON को प्रेषित करने के लिए सिस्टम कहता है, तो PHP टूट जाएगा। आप JSON 'Reviver' पद्धतियों को देखना चाह सकते हैं। – JAAulde

10

यह संशोधित करना वास्तव में संभव है कि डेट ऑब्जेक्ट को जेएसओएन में कैसे क्रमबद्ध किया जाएगा। रिवाइवर फ़ंक्शन के साथ, एक द्वि-दिशात्मक समाधान बनाया जा सकता है जो स्वचालित रूप से क्रमबद्धरण पर काम करेगा और आसानी से deserialization पर उपयोग किया जा सकता है।

सबसे पहले इस तरह क्रमबद्धता को संशोधित:

> json = JSON.stringify({test:new Date()}); 
"{"test":"{timestamp}1380164268633"}" 

तो फिर तुम एक बना सकते हैं:

Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() } 

यह एक मार्कर के रूप में एक उपसर्ग के साथ एक यूनिक्स टाइमस्टैम्प में एक तिथि वस्तु का प्रतिनिधित्व बदल जाएगा रिवाइवर फ़ंक्शन जो स्वचालित रूप से इन मानों को फ़िल्टर करेगा:

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

(क्रेडिट : इस कोड मूल रूप से एक संबंधित सवाल में इस उत्तर से नकल किया गया था: https://stackoverflow.com/a/14509447/2572897)

इस सेटअप के साथ

अब, पहले से हमारे परिणाम की अक्रमांकन फिर एक दिनांक वस्तु का परिणाम देगा:

> JSON.parse(json, json_deserialize_helper); 
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)} 

या आप चुन सकते हैं क्रमबद्धता को संशोधित करने के लिए नहीं, लेकिन इसके बजाय मानक क्रमबद्धता प्रारूप को पकड़ने के लिए regexp का उपयोग करें:

function json_deserialize_helper(key,value) { 
    if (typeof value === 'string') { 
    var regexp; 
    regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value); 
    if (regexp) { 
     return new Date(value); 
    } 
    } 
    return value; 
} 

उदाहरण:

> json = JSON.stringify({test:new Date()}) 
"{"test":"2013-09-26T03:05:26.563Z"}" 
> JSON.parse(json, json_deserialize_helper) 
Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)} 
0

Date.prototype.toJSON = function() {वापसी पल (यह) .format ('एल'); }

आप पल प्रलेखन और दर्जी प्रकार की तारीख के बारे में अधिक पढ़ सकते हैं, जिसे आप वापस करना चाहते हैं।

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