मुझे एक JSON स्ट्रिंग बनानी है जिसमें एक मान है नई लाइन वर्ण। इससे बचना होगा और फिर AJAX कॉल का उपयोग करके पोस्ट किया जाएगा। क्या कोई जावास्क्रिप्ट के साथ स्ट्रिंग से बचने का एक तरीका सुझा सकता है। मैं jQuery का उपयोग नहीं कर रहा हूँ।
मुझे एक JSON स्ट्रिंग बनानी है जिसमें एक मान है नई लाइन वर्ण। इससे बचना होगा और फिर AJAX कॉल का उपयोग करके पोस्ट किया जाएगा। क्या कोई जावास्क्रिप्ट के साथ स्ट्रिंग से बचने का एक तरीका सुझा सकता है। मैं jQuery का उपयोग नहीं कर रहा हूँ।
जवाबों:
अपने JSON और .stringify()
इसे ले लो । फिर .replace()
विधि का उपयोग करें और के \n
साथ होने वाली सभी घटनाओं को बदलें \\n
।
संपादित करें:
जहां तक मुझे पता है, एक स्ट्रिंग में सभी विशेष पात्रों से बचने के लिए कोई प्रसिद्ध जेएस लाइब्रेरी नहीं हैं। लेकिन, आप .replace()
विधि को चेन कर सकते हैं और इस तरह से सभी विशेष वर्णों को बदल सकते हैं:
var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");
// myEscapedJSONString is now ready to be POST'ed to the server.
लेकिन यह बहुत बुरा है, है ना? कार्यों की सुंदरता दर्ज करें, जिसमें वे आपको टुकड़ों में कोड को तोड़ने और अपनी स्क्रिप्ट के मुख्य प्रवाह को साफ रखने और 8 चैथल .replace()
कॉल से मुक्त रखने की अनुमति देते हैं । तो चलिए उस कार्यक्षमता को एक फ़ंक्शन में कहते हैं, जिसे escapeSpecialChars()
। के आगे जाना है और के लिए देते हैं prototype chain
की String
वस्तु है, तो हम कॉल कर सकते हैं escapeSpecialChars()
सीधे स्ट्रिंग वस्तुओं पर।
इस तरह:
String.prototype.escapeSpecialChars = function() {
return this.replace(/\\n/g, "\\n")
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");
};
एक बार जब हम उस फ़ंक्शन को परिभाषित कर लेते हैं, तो हमारे कोड का मुख्य भाग इस प्रकार सरल होता है:
var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server
User667073 के अनुसार, पहले बैकस्लैश रिप्लेसमेंट को फिर से चालू करने और उद्धरण प्रतिस्थापन को ठीक करने के अलावा सुझाव दिया गया था
escape = function (str) {
return str
.replace(/[\\]/g, '\\\\')
.replace(/[\"]/g, '\\\"')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t');
};
Line separator
\u2028
और Paragraph separator
\u2029
। Ref: es5.github.io/#x7.3
Uncaught SyntaxError: Unexpected token \ in JSON at position 2
आपकी तरह, मैं अपने JSON में विशेष एस्केप वर्णों को बदलने के लिए कई टिप्पणियों और पोस्ट को देख रहा हूं जिसमें उसके अंदर html ऑब्जेक्ट है।
मेरा उद्देश्य JSON ऑब्जेक्ट में विशेष वर्णों को निकालना है और html को भी प्रस्तुत करना है जो कि json ऑब्जेक्ट के अंदर है।
यहाँ मैंने वही किया है और आशा करता हूँ कि इसका उपयोग बहुत सरल होगा।
पहले मैंने JSON.string को अपनी jSON ऑब्जेक्ट किया और JSON.parse परिणाम।
उदाहरण के लिए:
JSON.parse(JSON.stringify(jsonObject));
और यह मेरी समस्या को हल करता है और शुद्ध जावास्क्रिप्ट का उपयोग करके किया जाता है।
stackoverflow
त्रुटि के साथ जटिल और बड़ी वस्तुओं पर टूट जाएगा
JSON.parse(JSON.stringify($("body")))
शरीर और कुछ टेबल के साथ एक html फ़ाइल में प्रयास करें । $ ("बॉडी") एक जावास्क्रिप्ट ऑब्जेक्ट है लेकिन स्ट्रिंग इसे पार्स करने में विफल हो जाएगी।
मुझे यह कहते हुए डर लग रहा है कि एलेक्स द्वारा दिया गया उत्तर गलत है, इसे हल्के ढंग से रखना:
यह समारोह
escape = function (str) {
// TODO: escape %x75 4HEXDIG ?? chars
return str
.replace(/[\"]/g, '\\"')
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
; };
एक बेहतर सन्निकटन प्रतीत होता है।
एकल उद्धरण के लिए एक छोटा सा अद्यतन
function escape (key, val) {
if (typeof(val)!="string") return val;
return val
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
.replace(/[\"]/g, '\\"')
.replace(/\\'/g, "\\'");
}
var myJSONString = JSON.stringify(myJSON,escape);
यह एक पुरानी पोस्ट है। लेकिन यह अभी भी angular.fromJson और JSON.stringify का उपयोग करने वालों के लिए उपयोगी हो सकता है। बचना () पदावनत करना है। इसके बजाय इसका उपयोग करें,
var uri_enc = encodeURIComponent(uri); //before you post the contents
var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents.
रेफरी http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
JSON.stringify पर दूसरा पैरामीटर भी है। तो, अधिक सुरुचिपूर्ण समाधान होगा:
function escape (key, val) {
if (typeof(val)!="string") return val;
return val
.replace(/[\"]/g, '\\"')
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
;
}
var myJSONString = JSON.stringify(myJSON,escape);
यह एक पुराना सवाल है लेकिन समाधान मेरे लिए अच्छा नहीं रहा क्योंकि इससे सभी मामले हल नहीं हुए। मुझे आखिरकार एक जवाब मिला जिसने यहां काम किया
मैं भागने का उपयोग करके और यूरी घटक को एनकोड करने के लिए अपने संयुक्त समाधान को पोस्ट करूंगा:
// implement JSON stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
var t = typeof (obj);
if (t != "object" || obj === null) {
// simple data type
if (t == "string") obj = '"'+obj+'"';
return String(obj);
}
else {
// recurse array or object
var n, v, json = [], arr = (obj && obj.constructor == Array);
for (n in obj) {
v = obj[n]; t = typeof(v);
if (t == "string") v = '"'+v+'"';
else if (t == "object" && v !== null) v = JSON.stringify(v);
json.push((arr ? "" : '"' + n + '":') + String(v));
}
var rawString = (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
return rawString;
}
};
function escape (key, val) {
if (typeof(val)!="string") return val;
var replaced = encodeURIComponent(val);
return replaced;
}
JSON.stringifyEscaped = function(obj){
return JSON.stringify(obj,escape);
}
escape = (string) -> JSON.stringify(string)[1...-1]
इसका उपयोग करना बेहतर है JSON.parse(yourUnescapedJson);
Json_encode () का उपयोग करें यदि आपका सर्वर साइड स्क्रिप्टिंग PHP है, तो आपके
json_encode()
लिए नई लाइन और अन्य अप्रत्याशित टोकन से बच जाता है (यदि आपकी स्क्रिप्टिंग भाषा के लिए समान फ़ंक्शन के लिए PHP लुक का उपयोग नहीं किया जाता है)
फिर $.parseJSON()
अपने जावास्क्रिप्ट में उपयोग करें!
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
php JSON.parse डबल एन्कोड
मुझे अपनी अजाक्स कॉल में एक ही स्थिति मिली, जहां JSON
टेक्सारिया क्षेत्र में नई रेखा के कारण एक त्रुटि थी। यहाँ दिए गए समाधान ने मेरे लिए काम नहीं किया। इसलिए मैंने जावास्क्रिप्ट के .escape
फ़ंक्शन का उपयोग किया और यह ठीक काम किया। फिर से मान प्राप्त करने के लिए JSON
, मैं बस का उपयोग कर unescaped .unescape
।
मैंने इनपुट को urlencode करने के लिए एक textarea से मान निकालने के लिए बिल्ट इन jQuery.serialize () का उपयोग किया। समर्थक हिस्सा यह है कि आपको प्रत्येक विशेष चार्ट को अपने दम पर बदलने की आवश्यकता नहीं है और मैं भी newlines रखता हूं और html से बच जाता हूं। यह काम करने के लिए क्रमबद्ध करने के लिए ऐसा लगता है कि इनपुट फ़ील्ड में एक नाम विशेषता होना आवश्यक है और यह बची हुई स्ट्रिंग में भी वही विशेषता जोड़ता है जिसे दूर करने की आवश्यकता है। वह नहीं हो सकता है जो आप ढूंढ रहे हैं लेकिन यह मेरे लिए काम करता है।
var myinputfield = jQuery("#myinputfield");
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
अजाक्स के किसी भी रूप का उपयोग करते समय, सीजीआई सर्वर से प्राप्त प्रतिक्रियाओं के प्रारूप के लिए विस्तृत दस्तावेज़ीकरण वेब पर अभाव लगता है। यहाँ कुछ प्रविष्टियाँ बताती हैं कि JSON रूपांतरण में अनन्त लूप्स (हैंग) को रोकने के लिए दिए गए टेक्स्ट या जोंस डेटा में न्यूलाइन्स को बचाना चाहिए (संभवतः एक अपवाद छोड़ कर बनाया गया), चाहे jQuery द्वारा या मैन्युअल रूप से जावास्क्रिप्ट सिस्टम या लाइब्रेरी JSON पार्सिंग का उपयोग करके स्वचालित रूप से किया गया हो कहता है।
प्रत्येक मामले में जहां प्रोग्रामर इस समस्या को पोस्ट करते हैं, अपर्याप्त समाधान प्रस्तुत किए जाते हैं (सबसे अधिक बार भेजने की ओर \ n द्वारा \ n की जगह) और मामला गिरा दिया जाता है। उनकी अपर्याप्तता तब प्रकट होती है जब स्ट्रिंग मान गुजरते हैं जो गलती से नियंत्रण से बचने के अनुक्रमों को एम्बेड करते हैं, जैसे कि विंडोज पाथनेम्स। एक उदाहरण "C: \ Chris \ Roberts.php" है, जिसमें नियंत्रण वर्ण ^ c और ^ r हैं, जो स्ट्रिंग के JSON रूपांतरण का कारण बन सकता है {"file": "C: \ Chris \ Roberts.php"} हमेशा के लिए पाश। ऐसे मूल्यों को उत्पन्न करने का एक तरीका जानबूझकर PHP चेतावनी और सर्वर से क्लाइंट, एक उचित विचार के लिए त्रुटि संदेश पारित करने का प्रयास है।
परिभाषा के अनुसार, अजाक्स पर्दे के पीछे HTTP कनेक्शन का उपयोग करता है। ऐसे कनेक्शन GET और POST का उपयोग करके डेटा पास करते हैं, दोनों को नियंत्रण वर्णों सहित गलत सिंटैक्स से बचने के लिए एन्कोडिंग भेजे गए डेटा की आवश्यकता होती है।
यह एक संकेत के निर्माण के लिए पर्याप्त देता है जो एक समाधान प्रतीत होता है (इसे अधिक परीक्षण की आवश्यकता होती है): डेटा को एन्कोड करने के लिए PHP (भेजने) की ओर से रॉर्क्लेंकोड का उपयोग करना और डेटा को डीकोड करने के लिए जावास्क्रिप्ट (प्राप्त करना) पक्ष पर अनस्केप करना। कुछ मामलों में, आप इन्हें पूरे टेक्स्ट स्ट्रिंग्स पर लागू करेंगे, अन्य मामलों में आप इन्हें केवल JSON के मानों पर लागू करेंगे।
यदि यह विचार सही हो जाता है, तो सभी स्तरों पर प्रोग्रामर की मदद करने के लिए सरल उदाहरणों का निर्माण किया जा सकता है और इस समस्या को एक बार के लिए हल कर सकते हैं।
ऐसा लगता है कि यह वास्तव में एक प्राचीन पोस्ट है :-) लेकिन दोस्तों, इसके लिए मेरे पास सबसे अच्छा वर्कअराउंड है, 100% होने के लिए कि यह जटिल कोड के बिना काम करता है, दोनों एन्कोडिंग / डिकोडिंग के दोनों कार्यों का उपयोग बेस 64 में करना है। ये एटोब () और बोटो () हैं। अब तक का सबसे आसान और सबसे अच्छा तरीका है, अगर आपको कोई पात्र छूटने से बच जाए तो चिंता करने की कोई जरूरत नहीं है।
जॉर्ज
स्ट्रिंग को एनकोड करने के लिए एनकोडर्कोम्पोनेंट () का उपयोग करें।
उदाहरण के लिए। var myEscapedJSONString = encodeURIComponent (JSON.stringify (myJSON));
आपको इसे डिकोड करने की आवश्यकता नहीं है क्योंकि वेब सर्वर स्वचालित रूप से ऐसा ही करता है।
कभी भी नियमित अभिव्यक्ति का उपयोग न करें (मेरा मतलब है कि कभी भी ऐसा नहीं है)। सबसे अच्छा और प्रभावी तरीका:
String.prototype.escapeJSON = function() {
var result = "";
for (var i = 0; i < this.length; i++)
{
var ch = this[i];
switch (ch)
{
case "\\": ch = "\\\\"; break;
case "\'": ch = "\\'"; break;
case "\"": ch = '\\"'; break;
case "\&": ch = "\\&"; break;
case "\t": ch = "\\t"; break;
case "\n": ch = "\\n"; break;
case "\r": ch = "\\r"; break;
case "\b": ch = "\\b"; break;
case "\f": ch = "\\f"; break;
case "\v": ch = "\\v"; break;
default: break;
}
result += ch;
}
return result;
};