javascript - किसी ऑब्जेक्ट में एक JSON स्ट्रिंग को सुरक्षित रूप से बदलना




(14)

JQuery विधि अब बहिष्कृत है। इसके बजाय इस विधि का प्रयोग करें:

let jsonObject = JSON.parse(jsonString);

बहिष्कृत jQuery कार्यक्षमता का उपयोग कर मूल जवाब :

यदि आप jQuery का उपयोग कर रहे हैं तो बस इसका उपयोग करें:

jQuery.parseJSON( jsonString );

यह वही है जो आप खोज रहे हैं (jQuery documentation देखें)।

JSON डेटा की एक स्ट्रिंग को देखते हुए, आप उस स्ट्रिंग को जावास्क्रिप्ट ऑब्जेक्ट में सुरक्षित रूप से कैसे बदल सकते हैं?

जाहिर है आप इस तरह कुछ के साथ असुरक्षित कर सकते हैं ...

var obj = eval("(" + json + ')');

... लेकिन यह हमें अन्य कोड वाले जेसन स्ट्रिंग के लिए कमजोर छोड़ देता है, जो इसे केवल eval के लिए बहुत खतरनाक लगता है।


JSON.parse () किसी JSON ऑब्जेक्ट को फ़ंक्शन में पास किए गए किसी भी JSON स्ट्रिंग को परिवर्तित करता है।

बेहतर समझने के लिए अपने ब्राउज़र के निरीक्षण तत्व को खोलने के लिए F12 दबाएं और निम्न आदेश लिखने के लिए कंसोल पर जाएं: -

var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.

अब आदेश चलाएं: -

console.log(JSON.parse(response));

आप ऑब्जेक्ट के रूप में आउटपुट प्राप्त करेंगे {परिणाम: सत्य, गिनती: 1}।

उस ऑब्जेक्ट का उपयोग करने के लिए, आप इसे वैरिएबल को असाइन कर सकते हैं चलो कहते हैं obj: -

var obj = JSON.parse(response);

अब obj और dot (।) ऑपरेटर का उपयोग करके आप JSON ऑब्जेक्ट के गुणों तक पहुंच सकते हैं।

आदेश चलाने की कोशिश करें

console.log(obj.result);

आप फ़िल्टर करने के लिए reviver फ़ंक्शन का भी उपयोग कर सकते हैं।

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

अधिक जानकारी के लिए JSON.parse(jsonString) पढ़ें


ऐसा लगता है कि यह मुद्दा है:

AJAX websocket आदि के माध्यम से एक इनपुट प्राप्त होता है, और यह हमेशा स्ट्रिंग प्रारूप में होगा - लेकिन आपको यह जानना होगा कि यह JSON.parsable है या नहीं। दोगुना है, कि यदि आप इसे हमेशा JSON.parse के माध्यम से चलाते हैं, तो प्रोग्राम मई को 'सफलतापूर्वक' जारी रख सकता है लेकिन आपको अभी भी ड्रेस्ड "त्रुटि: अप्रत्याशित टोकन 'x' के साथ कंसोल में फेंकने वाली त्रुटि दिखाई देगी।

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

जेएसओएन पार्सिंग हमेशा गधे में दर्द होता है। यदि इनपुट अपेक्षित नहीं है तो यह एक त्रुटि फेंकता है और आप जो कर रहे हैं उसे दुर्घटनाग्रस्त कर देता है। आप अपने इनपुट को सुरक्षित रूप से पार्स करने के लिए निम्न छोटे फ़ंक्शन का उपयोग कर सकते हैं। इनपुट हमेशा वैध नहीं है या यह पहले से ही एक वस्तु है जो ज्यादातर मामलों के लिए बेहतर है, यह हमेशा एक वस्तु को बदल देता है।

JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};

पुराना सवाल, मुझे पता है, हालांकि कोई भी new Function() , एक अज्ञात फ़ंक्शन का उपयोग करके इस समाधान को नहीं देखता है जो डेटा देता है।

बस एक उदाहरण:

 var oData = 'test1:"This is my object",test2:"This is my object"';

 if( typeof oData !== 'object' )
  try {
   oData = (new Function('return {'+oData+'};'))();
  }
  catch(e) { oData=false; }

 if( typeof oData !== 'object' )
  { alert( 'Error in code' ); }
 else {
        alert( oData.test1 );
        alert( oData.test2 );
      }

यह थोड़ा और सुरक्षित है क्योंकि यह किसी फ़ंक्शन के अंदर निष्पादित होता है और सीधे आपके कोड में संकलित नहीं होता है। तो यदि इसके अंदर कोई फ़ंक्शन घोषणा है, तो यह डिफ़ॉल्ट विंडो ऑब्जेक्ट से बाध्य नहीं होगा।

मैं इसे डीओएम तत्वों (उदाहरण के लिए डेटा विशेषता) की 'संकलित' कॉन्फ़िगरेशन सेटिंग्स को सरल और तेज़ करने के लिए उपयोग करता हूं।


मुझे एक "बेहतर" तरीका मिला:

कॉफीस्क्रिप्ट में:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

जावास्क्रिप्ट में:

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

मैं इसे करने के अन्य तरीकों के बारे में निश्चित नहीं हूं लेकिन प्रोटोटाइप (JSON ट्यूटोरियल) में आप इसे कैसे करते हैं।

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

तर्क के रूप में evalJSON () को कॉल करना तर्क के रूप में आने वाली स्ट्रिंग को sanitizes।


यदि आप jQuery का उपयोग कर रहे हैं, तो आप $.getJSON(url, function(data) { }); भी कर सकते हैं $.getJSON(url, function(data) { });

फिर आप data.key1.something , data.key1.something_else इत्यादि जैसी चीजें कर सकते हैं।


यदि आप चाहते हैं कि इस विधि का उपयोग इस तरह किया जा सके। यहां डेटा ऑब्जेक्ट जिसे आप पूर्व चाहते हैं: डेटा = '{परिणाम: सत्य, गिनती: 1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

यह विधि वास्तव में नोडज में मदद करती है यदि आप सीरियल पोर्ट प्रोग्रामिंग के साथ काम कर रहे हैं


एमएसडीएन पर निम्न लिंक में प्रतिनिधित्व सरल कोड का प्रयोग करें।

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

और विपरीत

var str = JSON.stringify(arr);

JSON.parse(jsonString) एक शुद्ध जावास्क्रिप्ट दृष्टिकोण है जब तक आप एक उचित आधुनिक ब्राउज़र की गारंटी दे सकते हैं।


आधिकारिक तौर पर दस्तावेज :

JSON.parse() विधि एक JSON स्ट्रिंग को JSON.parse() , जो स्ट्रिंग द्वारा वर्णित जावास्क्रिप्ट मान या ऑब्जेक्ट का निर्माण करती है। परिणामस्वरूप ऑब्जेक्ट पर लौटने से पहले एक वैकल्पिक reviver फ़ंक्शन प्रदान किया जा सकता है।

वाक्य - विन्यास

JSON.parse(text[, reviver])

पैरामीटर

टेक्स्ट

जेएसओएन के रूप में पार्स करने के लिए स्ट्रिंग। JSON वाक्यविन्यास के विवरण के लिए JSON ऑब्जेक्ट देखें।

पुनरुद्धार (वैकल्पिक)

यदि कोई फ़ंक्शन, यह निर्धारित करता है कि मूल रूप से पार्सिंग द्वारा उत्पादित मूल्य को वापस करने से पहले परिवर्तित किया जाता है।

प्रतिलाभ की मात्रा

दिए गए JSON पाठ से संबंधित ऑब्जेक्ट।

अपवाद

स्ट्रिंग को स्ट्रिंग मान्य JSON नहीं है, तो एक SyntaxError अपवाद फेंकता है।


$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

कॉलबैक लौटाया गया डेटा पास कर दिया गया है, जो जेएसओएन संरचना द्वारा परिभाषित एक जावास्क्रिप्ट ऑब्जेक्ट या सरणी होगी और $.parseJSON() विधि का उपयोग करके पार्स किया जाएगा।







json