एक URL में एक JSON स्ट्रिंग से बचने के लिए कैसे?


129

जावास्क्रिप्ट का उपयोग करना, मैं एक पृष्ठ पर एक लिंक उत्पन्न करना चाहता हूं। पृष्ठ के पैरामीटर एक जावास्क्रिप्ट सरणी में हैं जो मैं JSON में क्रमबद्ध करता हूं।

तो मैं उस तरह से एक URL उत्पन्न करना चाहूंगा:

http://example.com/?data="MY_JSON_ARRAY_HERE"

URL में पैरामीटर के रूप में इसे शामिल करने के लिए मुझे अपने JSON स्ट्रिंग (सरणी क्रमबद्ध) से बचने की क्या आवश्यकता है?

अगर JQuery का उपयोग करके कोई समाधान है तो मुझे अच्छा लगेगा।

नोट: हां, पृष्ठ के मापदंडों को एक सरणी में होना चाहिए क्योंकि उनमें से बहुत सारे हैं। मुझे लगता है कि मैं बाद में लिंक को छोटा करने के लिए bit.ly का उपयोग करूंगा।


यह भी देखें stackoverflow.com/questions/21802866/...
w00t

जवाबों:


210
encodeURIComponent(JSON.stringify(object_to_be_serialised))

10
ऐसा लगता है कि यह आवश्यक से अधिक वर्णों को एन्कोड करता है (जब मैं फ़ायरफ़ॉक्स में लिंक पेस्ट करता हूं, तो कुछ वर्ण वापस लौट जाते हैं (यानी {[")। क्या केवल आवश्यक वर्णों को एन्कोड करने का एक तरीका है, ताकि मैं अपने url को छोटा कर सकूं?
मैथ्यू नेपोली

19

आप encodeURIComponentक्वेरी स्ट्रिंग के सुरक्षित रूप से URL एनकोड भागों का उपयोग कर सकते हैं :

var array = JSON.stringify([ 'foo', 'bar' ]);
var url = 'http://example.com/?data=' + encodeURIComponent(array);

या यदि आप इसे AJAX अनुरोध के रूप में भेज रहे हैं:

var array = JSON.stringify([ 'foo', 'bar' ]);
$.ajax({
    url: 'http://example.com/',
    type: 'GET',
    data: { data: array },
    success: function(result) {
        // process the results
    }
});

19

मैं वही काम करना चाह रहा था। मेरे लिए समस्या यह थी कि मेरा url बहुत लंबा रास्ता तय कर रहा था। मुझे आज ब्रूनो जौहियर की jsUrl.js लाइब्रेरी का उपयोग करके एक समाधान मिला ।

मैंने अभी तक बहुत अच्छी तरह से इसका परीक्षण नहीं किया है। हालांकि, यहां 3 अलग-अलग तरीकों का उपयोग करके एक ही बड़ी वस्तु को एन्कोडिंग करने के बाद स्ट्रिंग आउटपुट की चरित्र लंबाई दिखाने वाला एक उदाहरण है:

  • 2651 वर्णों का उपयोग करना jQuery.param
  • 1691 वर्णों का उपयोग करना JSON.stringify + encodeURIComponent
  • 821 वर्णों का उपयोग करना JSURL.stringify

स्पष्ट रूप से JSURL के पास js ऑब्जेक्ट को urlEncoding के लिए सबसे अनुकूलित प्रारूप है।

https://groups.google.com/forum/?fromgroups=# -topic/ nodejs/ ivdZuGCF86Q पर थ्रेड एन्कोडिंग और पार्सिंग के लिए बेंचमार्क दिखाता है।

नोट : परीक्षण के बाद, ऐसा लगता है कि jsurl.js लाइब्रेरी में ECMAScript 5 फ़ंक्शन जैसे Object.keys, Array.map और Array.filter का उपयोग किया जाता है। इसलिए, यह केवल आधुनिक ब्राउज़रों (नहीं यानी 8 और उससे कम) पर काम करेगा। हालांकि, इन कार्यों के लिए पॉलीफ़िल हैं जो इसे अधिक ब्राउज़रों के साथ संगत करेंगे।


0.1.4 के बाद से यह IE 6-8 के साथ भी संगत है यदि आपको अभी भी उन की आवश्यकता है।
स्टॉफ


5

मैं एक ऑडबॉल विकल्प प्रदान करता हूँ। कभी-कभी अलग-अलग एन्कोडिंग का उपयोग करना आसान होता है, खासकर यदि आप विभिन्न प्रकार के सिस्टम से निपट रहे हैं जो सभी URL एन्कोडिंग के विवरण को एक ही तरीके से नहीं संभालते हैं। यह सबसे मुख्यधारा का दृष्टिकोण नहीं है, लेकिन कुछ स्थितियों में काम आ सकता है।

डेटा को URL-एन्कोडिंग के बजाय, आप इसे64-एनकोड कर सकते हैं। इसका लाभ यह है कि एन्कोड किया गया डेटा बहुत ही सामान्य है, जिसमें केवल अल्फा वर्ण और कभी-कभी अनुगामी होते हैं= । उदाहरण:

JSON सरणी के तार:

["option", "Fred's dog", "Bill & Trudy", "param=3"]

वह डेटा, URL को dataपरम के रूप में एनकोड किया गया :

"data=%5B%27option%27%2C+%22Fred%27s+dog%22%2C+%27Bill+%26+Trudy%27%2C+%27param%3D3%27%5D"

समान, बेस 64-एन्कोडेड:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

बेस 64 दृष्टिकोण थोड़ा छोटा हो सकता है, लेकिन इससे भी महत्वपूर्ण बात यह सरल है। मुझे अक्सर CURL, वेब ब्राउज़र और अन्य क्लाइंट के बीच URL-एन्कोडेड डेटा को स्थानांतरित करने में समस्या होती है, आमतौर पर उद्धरण, एम्बेडेड %संकेत और इसी तरह। Base64 बहुत तटस्थ है क्योंकि यह विशेष वर्णों का उपयोग नहीं करता है।


अंत में मेरे दोस्त (और) का पता (% 26) यहाँ मिला
प्रदीप कुमार प्रभाकरण

बेस 64 स्ट्रिंग्स के साथ समस्या यह है कि उनमें स्लैश (/) वर्ण हो सकता है, जो url को अमान्य कर देगा ...
ingbabic

यह सच है, लेकिन आप बेस 64 में उपयोग करने के लिए पात्रों का चयन कर सकते हैं: के /साथ प्रतिस्थापित करें $, _या किसी भी अन्य चरित्र को प्रति RFC 3986 के url एन्कोडिंग की आवश्यकता नहीं है।
क्रिस जॉनसन

0

डेलन द्वारा दिया गया उत्तर एकदम सही है। इसे जोड़ने के लिए - किसी को मापदंडों को नाम देना चाहिए या कई JSON तार अलग-अलग पास करना चाहिए - नीचे दिए गए कोड से मदद मिल सकती है!

JQuery

var valuesToPass = new Array(encodeURIComponent(VALUE_1), encodeURIComponent(VALUE_2), encodeURIComponent(VALUE_3), encodeURIComponent(VALUE_4));

data = {elements:JSON.stringify(valuesToPass)}

पीएचपी

json_decode(urldecode($_POST('elements')));

उम्मीद है की यह मदद करेगा!


URL में _ldST () डेटा जो PHP $ _POST या किसी अन्य (GET, REQEST, आदि) में आता है, की आवश्यकता नहीं है। आप यहां से क्या करते हैं, इसके आधार पर, आप सुरक्षा मुद्दे (एसक्यूएल इंजेक्शन, आदि) के लिए खुद को खोल सकते हैं
टाइट पेट्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.