जावास्क्रिप्ट का उपयोग करके एक JSON स्ट्रिंग से कैसे बचना चाहिए जिसमें newline वर्ण हैं?


166

मुझे एक JSON स्ट्रिंग बनानी है जिसमें एक मान है नई लाइन वर्ण। इससे बचना होगा और फिर AJAX कॉल का उपयोग करके पोस्ट किया जाएगा। क्या कोई जावास्क्रिप्ट के साथ स्ट्रिंग से बचने का एक तरीका सुझा सकता है। मैं jQuery का उपयोग नहीं कर रहा हूँ।


1
मैंने नई लाइन के चरित्र से बचने की कोशिश की \ n से \\ n। यह ठीक काम कर रहा है। लेकिन मैं किसी भी जेएस लाइब्रेरी की तलाश कर रहा हूं जो सभी एस्केप पात्रों के लिए ऐसा कर सके।
श्रीकांत

1
आपको JSON के भीतर नए समाचारों से बचने की आवश्यकता क्यों है? जब इनका उपयोग किया जाता है तो इन मूल्यों को कैसे डिकोड किया जा रहा है, क्योंकि संबंधित एन्कोडिंग फ़ंक्शन का उपयोग करने के लिए उपयुक्त समाधान है।
zzzzBov

मैंने 6 घंटे बिताए सभी प्रकार की चीज़ों की कोशिश कर रहे हैं, केवल एक अतिरिक्त अतिरिक्त स्लैश की खोज करने के लिए, यह जादू की तरह सभी काम करेगा जो मुझे लगा कि मुश्किल से 5 मिनट लगते हैं ... मुझे जो चीज़ दी गई थी वह असंभव हो गया। .omg
मुहम्मद उमर

1
जब आप सर्वर-साइड php-db-बचत के साथ अजाक्स-कॉल का उपयोग करते हैं, तो इसे परिवर्तित करने के लिए बस php-function Addlashes () का उपयोग करें। इस समाधान के साथ आपके पास केवल एक जगह है और इसके क्लीनर को जावास्क्रिप्ट-रिप्लेस लाइनों की तुलना में बदलना है।
मार्सेल एनिक्स

प्रासंगिक जवाब और समाधान देखें http://stackoverflow.com/questions/30366324/unescape-special-characters-in-ajax-response-data
kofifus

जवाबों:


135

अपने 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

3
धन्यवाद एलेक्स। मुझे भागने के सभी पात्रों के लिए यह करना है? क्या ऐसा करने के लिए कोई जेएस लाइब्रेरी है?
श्रीकांत

2
यह सटीक फ़ंक्शन है, जिसने मेरी समस्या को हल किया है String.prototype.escapeSpecialChars = function () {this -replace (/ \\ / g, "\\\\") को वापस करें। बदलें (/ \ n / g, "\\ n")। बदलें (/ \ r / g, "\\ r")। बदलें (/ \ t / g, "\\ t")। बदलें (/ \ f / g, "\\ f")। (/ "/ जी," \\\ "") की जगह। की जगह (/ '/ जी, "\\\'")। बदलें (/ \ & / g, "\\ &"); }
श्रीकांत

10
जैसा कि user667073 द्वारा उत्तर में दिया गया है, इस समाधान में कुछ त्रुटियां हैं। Json.org देखें - और 'बचना नहीं चाहिए।
अलेक्जेंडर क्लिमेत्स्क 22

5
मुझे यह मत देना पड़ा क्योंकि नियमित भाव गलत लगते हैं। मैंने इसका उपयोग करने की कोशिश की, लेकिन स्लैश में से एक को हटाकर नियमित अभिव्यक्ति को ठीक करना था, उदाहरण के लिए: / \\ n / g / \ n / g होना चाहिए। विवरण के लिए इस लिंक पर "गैर-मुद्रण योग्य वर्ण" देखें - RegExp Info
b01

1
खुद के बारे में क्या? क्या वह भी बच जाना चाहिए?
अर्श मोयन

65

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');
};

3
आपको ये सब करने की जरूरत नहीं है। केवल बैकस्लैश, न्यूलाइन, लाइनफीड और दो उद्धरण। और यह याद आ रही है: एकल उद्धरण, Line separator \u2028और Paragraph separator \u2029। Ref: es5.github.io/#x7.3
एरियल

1
अच्छा है, लेकिन वर्ग कोष्ठक क्यों आवश्यक हैं और नहीं: बच = फ़ंक्शन (str) {वापसी 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'); };
जोहान इचावरिया

3
उत्तम। स्वीकृत उत्तर (इस एक के ऊपर) बस काम नहीं करता है। नोडजेएस का उपयोग करना।
योसी शशो

मुझे यह त्रुटि मिलती है:Uncaught SyntaxError: Unexpected token \ in JSON at position 2
पाथ्रो

32

आपकी तरह, मैं अपने JSON में विशेष एस्केप वर्णों को बदलने के लिए कई टिप्पणियों और पोस्ट को देख रहा हूं जिसमें उसके अंदर html ऑब्जेक्ट है।

मेरा उद्देश्य JSON ऑब्जेक्ट में विशेष वर्णों को निकालना है और html को भी प्रस्तुत करना है जो कि json ऑब्जेक्ट के अंदर है।

यहाँ मैंने वही किया है और आशा करता हूँ कि इसका उपयोग बहुत सरल होगा।

पहले मैंने JSON.string को अपनी jSON ऑब्जेक्ट किया और JSON.parse परिणाम।

उदाहरण के लिए:

JSON.parse(JSON.stringify(jsonObject));

और यह मेरी समस्या को हल करता है और शुद्ध जावास्क्रिप्ट का उपयोग करके किया जाता है।


4
यह निश्चित रूप से जाने का रास्ता है
ओज लोद्रिग्ज़

1
यह निश्चित रूप से जाने का रास्ता है!
मंगल ग्रह

1
यह निश्चित रूप से stackoverflowत्रुटि के साथ जटिल और बड़ी वस्तुओं पर टूट जाएगा
एएए

1
JSON.parse(JSON.stringify($("body")))शरीर और कुछ टेबल के साथ एक html फ़ाइल में प्रयास करें । $ ("बॉडी") एक जावास्क्रिप्ट ऑब्जेक्ट है लेकिन स्ट्रिंग इसे पार्स करने में विफल हो जाएगी।
एएए

मैं आपकी क्वेरी की जांच करूंगा और वापस करूंगा।
बालासुब्रमणि एम

24

मुझे यह कहते हुए डर लग रहा है कि एलेक्स द्वारा दिया गया उत्तर गलत है, इसे हल्के ढंग से रखना:

  • एलेक्स के भागने की कोशिश करने वाले कुछ पात्रों को भागने की आवश्यकता नहीं है (जैसे और ');
  • \ b सभी बैकस्पेस कैरेक्टर में नहीं है, बल्कि एक शब्द सीमा मैच है
  • भागने के लिए आवश्यक वर्णों को संभाला नहीं जाता है।

यह समारोह

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')
    ; };

एक बेहतर सन्निकटन प्रतीत होता है।


5
वास्तव में आपको दोहरे उद्धरणों से पहले बैकस्लैश बदलने का क्रम बदलना चाहिए, अन्यथा आप \\\\ "के साथ समाप्त हो जाएंगे। उद्धरण पंक्ति भी होनी चाहिए .replace (/ [\"] / g, '\\'। "")
रायन

10

एकल उद्धरण के लिए एक छोटा सा अद्यतन

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);

7

यह एक पुरानी पोस्ट है। लेकिन यह अभी भी 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


stringify पहले से ही आपके लिए सभी पलायन करता है - मैं उत्सुक हूं कि बस उसका उपयोग क्यों नहीं किया जाए? git.io/vglq7
बेन डेविस

5

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);

5

यह एक पुराना सवाल है लेकिन समाधान मेरे लिए अच्छा नहीं रहा क्योंकि इससे सभी मामले हल नहीं हुए। मुझे आखिरकार एक जवाब मिला जिसने यहां काम किया

मैं भागने का उपयोग करके और यूरी घटक को एनकोड करने के लिए अपने संयुक्त समाधान को पोस्ट करूंगा:

// 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]
राडेक


3

Json_encode () का उपयोग करें यदि आपका सर्वर साइड स्क्रिप्टिंग PHP है, तो आपके json_encode()लिए नई लाइन और अन्य अप्रत्याशित टोकन से बच जाता है (यदि आपकी स्क्रिप्टिंग भाषा के लिए समान फ़ंक्शन के लिए PHP लुक का उपयोग नहीं किया जाता है)

फिर $.parseJSON()अपने जावास्क्रिप्ट में उपयोग करें!


अगर JSON स्ट्रिंग के रूप में php से जावास्क्रिप्ट में डेटा पास करते हैं, तो इस उत्तर की जांच करें - डबल एसेडिंग, ने मुझे JSON.parse पास करने और json string को ऑब्जेक्ट में बदलने में मदद की। <script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script> php JSON.parse डबल एन्कोड
व्लादिमीर वुकानैक 10

2

मुझे अपनी अजाक्स कॉल में एक ही स्थिति मिली, जहां JSONटेक्सारिया क्षेत्र में नई रेखा के कारण एक त्रुटि थी। यहाँ दिए गए समाधान ने मेरे लिए काम नहीं किया। इसलिए मैंने जावास्क्रिप्ट के .escapeफ़ंक्शन का उपयोग किया और यह ठीक काम किया। फिर से मान प्राप्त करने के लिए JSON, मैं बस का उपयोग कर unescaped .unescape


अजाक्स कॉल का उपयोग करना, मैं php-function newStr = Addlashes (str) का उपयोग करना पसंद करता हूं, फिर db में सेव करें। इसलिए मुझे जावास्क्रिप्ट- (क्लाइंट) में बदलना होगा। इस समाधान के साथ आपको स्लैश को बदलने के लिए केवल एक जगह की आवश्यकता होती है। इस समाधान से मैं बहुत खुश हूं।
मार्सेल एनिक्स

2

मैंने इनपुट को urlencode करने के लिए एक textarea से मान निकालने के लिए बिल्ट इन jQuery.serialize () का उपयोग किया। समर्थक हिस्सा यह है कि आपको प्रत्येक विशेष चार्ट को अपने दम पर बदलने की आवश्यकता नहीं है और मैं भी newlines रखता हूं और html से बच जाता हूं। यह काम करने के लिए क्रमबद्ध करने के लिए ऐसा लगता है कि इनपुट फ़ील्ड में एक नाम विशेषता होना आवश्यक है और यह बची हुई स्ट्रिंग में भी वही विशेषता जोड़ता है जिसे दूर करने की आवश्यकता है। वह नहीं हो सकता है जो आप ढूंढ रहे हैं लेकिन यह मेरे लिए काम करता है।

var myinputfield = jQuery("#myinputfield"); 
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');

1

अजाक्स के किसी भी रूप का उपयोग करते समय, सीजीआई सर्वर से प्राप्त प्रतिक्रियाओं के प्रारूप के लिए विस्तृत दस्तावेज़ीकरण वेब पर अभाव लगता है। यहाँ कुछ प्रविष्टियाँ बताती हैं कि JSON रूपांतरण में अनन्त लूप्स (हैंग) को रोकने के लिए दिए गए टेक्स्ट या जोंस डेटा में न्यूलाइन्स को बचाना चाहिए (संभवतः एक अपवाद छोड़ कर बनाया गया), चाहे jQuery द्वारा या मैन्युअल रूप से जावास्क्रिप्ट सिस्टम या लाइब्रेरी JSON पार्सिंग का उपयोग करके स्वचालित रूप से किया गया हो कहता है।

प्रत्येक मामले में जहां प्रोग्रामर इस समस्या को पोस्ट करते हैं, अपर्याप्त समाधान प्रस्तुत किए जाते हैं (सबसे अधिक बार भेजने की ओर \ n द्वारा \ n की जगह) और मामला गिरा दिया जाता है। उनकी अपर्याप्तता तब प्रकट होती है जब स्ट्रिंग मान गुजरते हैं जो गलती से नियंत्रण से बचने के अनुक्रमों को एम्बेड करते हैं, जैसे कि विंडोज पाथनेम्स। एक उदाहरण "C: \ Chris \ Roberts.php" है, जिसमें नियंत्रण वर्ण ^ c और ^ r हैं, जो स्ट्रिंग के JSON रूपांतरण का कारण बन सकता है {"file": "C: \ Chris \ Roberts.php"} हमेशा के लिए पाश। ऐसे मूल्यों को उत्पन्न करने का एक तरीका जानबूझकर PHP चेतावनी और सर्वर से क्लाइंट, एक उचित विचार के लिए त्रुटि संदेश पारित करने का प्रयास है।

परिभाषा के अनुसार, अजाक्स पर्दे के पीछे HTTP कनेक्शन का उपयोग करता है। ऐसे कनेक्शन GET और POST का उपयोग करके डेटा पास करते हैं, दोनों को नियंत्रण वर्णों सहित गलत सिंटैक्स से बचने के लिए एन्कोडिंग भेजे गए डेटा की आवश्यकता होती है।

यह एक संकेत के निर्माण के लिए पर्याप्त देता है जो एक समाधान प्रतीत होता है (इसे अधिक परीक्षण की आवश्यकता होती है): डेटा को एन्कोड करने के लिए PHP (भेजने) की ओर से रॉर्क्लेंकोड का उपयोग करना और डेटा को डीकोड करने के लिए जावास्क्रिप्ट (प्राप्त करना) पक्ष पर अनस्केप करना। कुछ मामलों में, आप इन्हें पूरे टेक्स्ट स्ट्रिंग्स पर लागू करेंगे, अन्य मामलों में आप इन्हें केवल JSON के मानों पर लागू करेंगे।

यदि यह विचार सही हो जाता है, तो सभी स्तरों पर प्रोग्रामर की मदद करने के लिए सरल उदाहरणों का निर्माण किया जा सकता है और इस समस्या को एक बार के लिए हल कर सकते हैं।


0

ऐसा लगता है कि यह वास्तव में एक प्राचीन पोस्ट है :-) लेकिन दोस्तों, इसके लिए मेरे पास सबसे अच्छा वर्कअराउंड है, 100% होने के लिए कि यह जटिल कोड के बिना काम करता है, दोनों एन्कोडिंग / डिकोडिंग के दोनों कार्यों का उपयोग बेस 64 में करना है। ये एटोब () और बोटो () हैं। अब तक का सबसे आसान और सबसे अच्छा तरीका है, अगर आपको कोई पात्र छूटने से बच जाए तो चिंता करने की कोई जरूरत नहीं है।

जॉर्ज


चूँकि मैं उसी समाधान के साथ आया था। मुझे आश्चर्य है कि अगर कोई इस समाधान को स्पष्ट कर सकता है और घरघराहट करता है तो कुछ छिपे हुए गुहाएं हैं। धन्यवाद।
माहिष

0

यदि आपके Googles आपको यहां लाते रहते हैं और आपकी Api त्रुटियों को तब तक जारी रखते हैं जब तक कि आपके JSON के दोहरे उद्धरण बच गए हों ( "{\"foo\": true}"), आपको बस दो बार स्ट्रिंग करने की आवश्यकता होती है उदा।JSON.stringify(JSON.stringify(bar))


-1

स्ट्रिंग को एनकोड करने के लिए एनकोडर्कोम्पोनेंट () का उपयोग करें।

उदाहरण के लिए। var myEscapedJSONString = encodeURIComponent (JSON.stringify (myJSON));

आपको इसे डिकोड करने की आवश्यकता नहीं है क्योंकि वेब सर्वर स्वचालित रूप से ऐसा ही करता है।


-8

कभी भी नियमित अभिव्यक्ति का उपयोग न करें (मेरा मतलब है कि कभी भी ऐसा नहीं है)। सबसे अच्छा और प्रभावी तरीका:

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;
};

आप यह नहीं कह सकते हैं, "कभी भी नियमित अभिव्यक्ति का उपयोग न करें (मेरा मतलब है जैसे कभी नहीं)"। प्रत्येक उपकरण अपने उद्देश्य को पूरा करता है।
zstate

आपका उत्तर मान्य है, आपने इसे केवल उच्च विचार वाले तरीके से व्यक्त किया है, जो भ्रम पैदा कर सकता है, खासकर जूनियर्स के लिए।
zstate

@oncode नियमित अभिव्यक्ति अविश्वसनीय रूप से बेकार हैं, कोई फर्क नहीं पड़ता कि उन्हें कैसे और कब उपयोग करना है। यह केवल अपरिभाषित व्यवहार और सीपीयू समय बर्बाद कर रहा है।
एल्प डेपलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.