2011-11-21 2 views
7

मैं एक जेएसओएन स्ट्रिंग को पार्स करने की कोशिश कर रहा हूं जो कि मेरे रेल कोड को कॉल करने वाले कुकी मूल्य के अंदर संग्रहीत है।जावास्क्रिप्ट द्वारा उत्पन्न कुकी से जेएसओएन स्ट्रिंग को पार्सिंग

रेल कॉमा (',') तक स्ट्रिंग को पढ़ने में सक्षम है जो दो अलग-अलग कुंजी को अलग करता है: स्ट्रिंग में मान जोड़े।

जावास्क्रिप्ट:

var value1 = "v1"; 
var value2 = "v2"; 
var obj = { key1: value1, key2: value2 }; 
document.cookie = "cookiename="+JSON.stringify(obj); 

कुकी:

Name: cookiename 
Content: {"key1":v1,"key2":v2} 

रेल:

@cookievalue = cookies[:cookiename] 

रेल जब एक ERB में @cookievalue बुला <% = @cookievalue%> यह के रूप में मूल्यांकन करता है:

{"key1":v1 

कॉमा (',') से पहले कुछ भी जो कुंजी 1 को अलग करता है: v1, key2: v2 गुम है।

कोई विचार?

मैंने इसे सीधे पाठ के रूप में करने की कोशिश की और यह वही बात है जो इसे पहले कॉमा से मुकाबला करती है।

UPDATED उत्तर नीचे मेरे अपने प्रश्न - अल्पविराम एक एनकोड() जे एस का उपयोग कर मूल्यों को अलग करने से बचने के लिए की जरूरत है।

उत्तर

7

अल्पविराम एक वैध चरित्र नहीं है (मैंने स्पष्ट रूप से इसे देखा है) और इस तरह इसके बाद सबकुछ गिरा दिया गया।

UPDATED ठीक: वर्ण ठीक से

document.cookie = "cookiename="+encodeURIComponent(JSON.stringify(obj)); 

यह बच निकलता है और अपने सर्वर को JSON स्वरूपित स्ट्रिंग ठीक से गुजरता है:

एक encodeURIComponent() जावास्क्रिप्ट को जोड़ा गया। एन्कोड() के बजाय एन्कोड() के बजाय एन्कोडिंग() के बजाय एन्कोड() के बजाय एन्कोडुरिकॉम्पोनेंट() का उपयोग भी किया जाता है।

सर्वर साइड परिवर्तन (वैकल्पिक):

@cookievalue = JSON.parse(cookies[:cookiename]) 

यह मैं JSON स्ट्रिंग थोड़ा आसान एक बार से कुकी लिया गया पार्स करने के लिए अनुमति देता है [: cookiename]

पिछला फिक्स:

जोड़ा एक जावास्क्रिप्ट में एन्कोड():

document.cookie = "cookiename="+encode(JSON.stringify(obj));