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


1334

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

जाहिर है मैं इस तरह से कुछ भी कर सकते हैं:

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

लेकिन वह मुझे JSON स्ट्रिंग के लिए असुरक्षित बनाता है जिसमें अन्य कोड होते हैं, जो कि केवल निष्कासन के लिए बहुत खतरनाक लगता है।


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

19
ठीक है, अब यह 2014 है और आपको evalJSON स्ट्रिंग को पार्स करने के लिए कभी भी उपयोग नहीं करना चाहिए क्योंकि आप "कोड" के लिए अपने कोड को उजागर करेंगे। JSON.parse(yourString)इसके बजाय उपयोग करें ।
डैनियल

क्या JSON डेटा शाब्दिक है?
शचीची

@ शेंचिउ: यदि आपका मतलब स्केलर डेटा टाइप है, तो यह हाँ है। क्या इसमें एक कुंजी-मूल्य सिंटैक्स के साथ सिर्फ एक स्ट्रिंग है।
0zkr पीएम

जवाबों:


1960

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


74
मुझे पूरा यकीन है कि यह Node.js के लिए सुरक्षित है
स्टीफन

76
@vsync आपको पता चलता है कि यह केवल शुद्ध जावास्क्रिप्ट उत्तर है ... यदि आप जावास्क्रिप्ट टैग के लिए विवरण पढ़ते हैं तो आप इसे देखेंगे ... " जब तक एक फ्रेमवर्क / लाइब्रेरी के लिए एक टैग भी शामिल नहीं होता है, शुद्ध जावास्क्रिप्ट उत्तर है उम्मीद है। ".. मैं इसे केवल जावास्क्रिप्ट उत्तर होने के लिए एक +1 देता
हूं


12
यदि आप NodeJS कर रहे हैं, तो कोई तरीका नहीं है कि मैं jQuery को सिर्फ एक JSONString में पार्स करने के लिए लोड करूं। तो जोनाथन के जवाब को आगे बढ़ाएं
एंटनी

6
इस लिंक के अनुसार यह IE8 + द्वारा समर्थित है, हालांकि यह कहता है:Requires document to be in IE8+ standards mode to work in IE8.
जोशुआ डेविड

878

JQuery विधि अब पदावनत हो गई है। इसके बजाय इस विधि का उपयोग करें:

let jsonObject = JSON.parse(jsonString);

मूल उत्तर jQuery कार्यक्षमता का उपयोग कर :

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

jQuery.parseJSON( jsonString );

यह वही है जो आप देख रहे हैं (jQuery के दस्तावेज़ देखें )।


7
क्या JSON.parse () पर इसका उपयोग करने का कोई कारण है?
जॉन

8
jQuery.parseJSONJSON.parseयदि यह मौजूद है, तो इसका उपयोग करने के लिए चूक , इसलिए असली पर इस का उपयोग करने का एकमात्र कारण है यदि आपको <IE7 के लिए फ़ालबैक की आवश्यकता है। इसे jQuery 1.6 में वापस बदल दिया गया था: james.padolsey.com/jquery/#v=1.6.0&fn=jQuery.parseJSON
कार्ल-जोहान

9
2016 अद्यतन: jQuery 3.0 के रूप में, $ .parseJSON को पदावनत किया गया है और आपको इसके बजाय मूल JSON.parent विधि का उपयोग करना चाहिए।
जकदेव

159

यह उत्तर IE <7 के लिए है, आधुनिक ब्राउज़रों के लिए जोनाथन के उत्तर की जाँच करें।

यह उत्तर पुराना है और ऊपर जोनाथन का उत्तर ( JSON.parse(jsonString)) अब सबसे अच्छा उत्तर है

JSON.org में जावास्क्रिप्ट के लिए चार अलग-अलग सहित कई भाषाओं के लिए JSON पार्सर हैं। मुझे विश्वास है कि अधिकांश लोग json2.js को उनके गोटो कार्यान्वयन पर विचार करेंगे ।


24
काश लोग इस जवाब को वोट देना बंद कर देते। यह 2008 में पोस्ट किया गया था जब यह सही था। बस एक नया upvote।
जॉन

22
यदि उत्तर अब पुराना हो गया है, तो इसे अद्यतन करने पर विचार करें।
सोतिरियोस डेलिमोलिस

2
IE <8 के लिए आपको इसका उपयोग करने की आवश्यकता है।
महमूदवक्स

74

" JSON.parse () " में सरल कोड उदाहरण का उपयोग करें :

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

और इसे उल्टा कर रहा है:

var str = JSON.stringify(arr);

23

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

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

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


22

यह मुद्दा लगता है:

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

var data;

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

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

नहीं। मुद्दा यह है कि आप एक JSON ऑब्जेक्ट की उम्मीद कर रहे हैं और (function(){ postCookiesToHostileServer(); }());नोड के संदर्भ में या यहां तक ​​कि नास्टियर सामान के साथ समाप्त हो सकता है ।
योर

खैर JSON.parse फ़ंक्शंस के इनपुट को स्क्रब करता है (जो इस मामले में इसके आईआईएफ -> ऑब्जेक्ट के रूप में मदद नहीं करेगा)। यह इस विषय के बारे में जाने का सबसे अच्छा तरीका है कोशिश / पकड़। (देखें संपादित करें)
कोड़ी

18

यदि आप jQuery का उपयोग कर रहे हैं , तो आप भी उपयोग कर सकते हैं:

$.getJSON(url, function(data) { });

तब आप जैसे काम कर सकते हैं

data.key1.something
data.key1.something_else

आदि।


आप jQuery का उपयोग कर रहे हैं, क्या आप नहीं हैं?
अलेक्जेंड्रे सी।

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

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


12

बस मज़े के लिए, यहाँ एक फ़ंक्शन का उपयोग करने का तरीका है:

 jsonObject = (new Function('return ' + jsonFormatData))()

1
दिलचस्प दृष्टिकोण, मुझे यकीन नहीं है कि मैं इसे JSON.Parse के साथ उपयोग करूंगा, लेकिन यह किसी को बॉक्स के बाहर सोचकर देखना अच्छा है।

5
यह केवल evalइसे करने के लिए उपयोग करने के लिए समान है और सुरक्षित नहीं है। : पी
फ्लोरि

7
यह उपयोग करने की सभी कमियां हैं, evalलेकिन समझने के लिए बनाए रखने के लिए अधिक जटिल और कठिन है।
क्वेंटिन

9

उपयोग करना JSON.parseशायद सबसे अच्छा तरीका है।

यहाँ एक उदाहरण लाइव डेमो है

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);

9

parse()विधि का उपयोग करने का सबसे आसान तरीका :

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

फिर आप JSON तत्वों के मान प्राप्त कर सकते हैं, उदाहरण के लिए:

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

प्रलेखन में वर्णित jQuery का उपयोग करना jQuery.parseJSON():

JSON.parse(jsonString);

9

इस डेटा ऑब्जेक्ट के साथ विधि का उपयोग करने का प्रयास करें। पूर्व: Data='{result:true,count:1}'

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

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


यह वास्तव में मज़ेदार है कि कैसे लोगों को "बुराई बुराई है" के लिए ठीक किया जाता है और वे इससे बचने के लिए कुछ भी करेंगे, यहां तक ​​कि पूरे
eval-

क्या सर्वसम्मति यह ट्रिक JSON ऑब्जेक्ट में स्ट्रिंग को सुरक्षित करने का एक सुरक्षित तरीका है? मैं इसका उपयोग कर सकता हूं क्योंकि अतिरिक्त js आयात की आवश्यकता नहीं है।
जिसका समय

1
किसी भी दृष्टिकोण का उपयोग evalया Functionसमान रूप से असुरक्षित है
Slai

undefined; function bye() {...} bye();
साल्वेरियर

5

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

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

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

4

JSON पार्सिंग हमेशा एक दर्द होता है। यदि इनपुट उम्मीद के मुताबिक नहीं है, तो यह एक त्रुटि फेंकता है और आप जो कर रहे हैं वह दुर्घटनाग्रस्त हो जाता है।

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

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

Object.prototype.toString.call(input) === '[object Object]'typeof input === 'object'आईएमओ होना चाहिए
सर्ज के।

टाइपऑफ़ इनपुट नल और सरणियों के लिए भी वस्तु देता है। तो यह ऐसा करने का सुरक्षित तरीका नहीं है।
तहसीन तुर्कोज़

आप पहले से ही कवर nullसे पहले मामले में, और एक सरणी है एक वस्तु। यदि आप इसका परीक्षण करना चाहते हैं, तो आप उपयोग कर सकते हैं instanceof। इसके अलावा, यदि आप इस फ़ंक्शन को देते हैं, तो Arrayयह पकड़ लेगा और return defजब यह पूरी तरह से ठीक सरणी वापस कर सकता है।
सर्ज के।

वस्तुओं को पकड़ते समय मेरी टिप्पणी एक सामान्य ज्ञान के बारे में थी। मेरे कार्य में कई रोकथाम हो सकती हैं लेकिन टाइपो इनपुट का उपयोग करना सामान्य रूप से वस्तुओं का पता लगाने का पसंदीदा तरीका नहीं है।
तहसीन तुर्कोज़

IMO, सामान्य ज्ञान, toString()वैटर को जाँचने के लिए विधि का उपयोग नहीं करता है एक चर एक वस्तु है या नहीं। देखें AngularJS , jQuery , अंडरस्कोर , या यहाँ तक devs
सर्ज लालकृष्ण


3

अगर हमारे पास इस तरह से एक स्ट्रिंग है:

"{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"

तब हम JSON.parseइस स्ट्रिंग को JSON ऑब्जेक्ट में बदलने के लिए बस दो बार उपयोग कर सकते हैं :

var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)

और हम JSON ऑब्जेक्ट का उपयोग करके मान निकाल सकते हैं:

// instead of last JSON.parse:
var { status, token } = JSON.parse(jsonString);

परिणाम होगा:

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059

3

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

आपको एक ऑब्जेक्ट के रूप में आउटपुट मिलेगा {result: true, count: 1}

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

var obj = JSON.parse(response);

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

कमांड चलाने का प्रयास करें:

console.log(obj.result);

3

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

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

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

JSON.parse(text[, reviver])

पैरामीटर:

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

reviver (optional) : यदि कोई फ़ंक्शन, यह निर्धारित करता है कि मूल रूप से पार्सिंग द्वारा उत्पादित मूल्य कैसे बदल दिया जाता है, तो लौटने से पहले।

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

दिए गए JSON टेक्स्ट के अनुरूप वस्तु।

अपवाद

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



2

JSON स्ट्रिंग को पार्स करें JSON.parse(), और डेटा एक जावास्क्रिप्ट ऑब्जेक्ट बन जाता है:

JSON.parse(jsonString)

यहां, JSON, JSON डेटासेट को संसाधित करने का प्रतिनिधित्व करता है।

कल्पना करें कि हमें वेब सर्वर से यह पाठ प्राप्त हुआ है:

'{ "name":"John", "age":30, "city":"New York"}'

JSON ऑब्जेक्ट में पार्स करने के लिए:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 

यहाँ objसंबंधित JSON ऑब्जेक्ट है जो दिखता है:

{ "name":"John", "age":30, "city":"New York"}

एक मान प्राप्त करने के लिए .ऑपरेटर का उपयोग करें :

obj.name // John
obj.age //30

एक जावास्क्रिप्ट ऑब्जेक्ट को एक स्ट्रिंग में बदलें JSON.stringify()


1

बस विभिन्न इनपुट प्रकारों के लिए कवर पार्स करने के लिए

JSON.parse () के साथ डेटा पार्स करें, और डेटा एक जावास्क्रिप्ट ऑब्जेक्ट बन जाता है।

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');

किसी JSON पर JSON.parse () का उपयोग किसी सरणी से प्राप्त होने पर, जावास्क्रिप्ट ऑब्जेक्ट के बजाय, विधि जावास्क्रिप्ट सरणी लौटाएगा।

var myArr = JSON.parse(this.responseText);
console.log(myArr[0]);

JSON में दिनांक ऑब्जेक्ट की अनुमति नहीं है। डेट्स के लिए कुछ इस तरह से करते हैं

var text = '{ "name":"John", "birth":"1986-12-14", "city":"New York"}';
var obj = JSON.parse(text);
obj.birth = new Date(obj.birth);

JSON में फ़ंक्शंस की अनुमति नहीं है। यदि आपको एक फ़ंक्शन शामिल करने की आवश्यकता है, तो इसे स्ट्रिंग के रूप में लिखें।

var text = '{ "name":"John", "age":"function () {return 30;}", "city":"New York"}';
var obj = JSON.parse(text);
obj.age = eval("(" + obj.age + ")");

0

पुराना सवाल, मुझे पता है, हालांकि कोई भी इस समाधान का उपयोग करके नोटिस नहीं 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 );
      }

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

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


0

सारांश:

जावास्क्रिप्ट (दोनों ब्राउज़र और NodeJS) में एक अंतर्निहित JSONवस्तु है। इस वस्तु से निपटने के लिए 2 सुविधाजनक तरीके हैं JSON। वे निम्नलिखित हैं:

  1. JSON.parse()JSONतर्क के रूप में लेता है, जेएस वस्तु लौटाता है
  2. JSON.stringify() जेएस ऑब्जेक्ट को तर्क रिटर्न JSONऑब्जेक्ट के रूप में लेता है

अन्य अनुप्रयोगों:

बहुत आसानी से निपटने के अलावा, JSONवे अन्य साधनों के लिए इस्तेमाल किया जा सकता है। दोनों JSONविधियों का संयोजन हमें बहुत आसान बनाने के लिए सरणियों या वस्तुओं के गहरे क्लोन बनाने की अनुमति देता है। उदाहरण के लिए:

let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();

arr1[2][0] = 'changed'; 
console.log(newArr); // not a deep clone

let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));

arr2[2][0] = 'changed'; 
console.log(newArrDeepclone); // A deep clone, values unchanged


0

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

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

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


0

JSON.parse एक स्ट्रिंग को ऑब्जेक्ट में बदलने का सही तरीका है लेकिन यदि स्ट्रिंग जो पार्स की गई है वह ऑब्जेक्ट नहीं है या यदि स्ट्रिंग सही नहीं है तो यह एक एरर फेंक देगा जिससे बाकी कोड टूट जाएगा। कोशिश करने के लिए JSON.parse फ़ंक्शन को लपेटने के लिए आदर्श-जैसे

try{
   let obj = JSON.parse(string);
}catch(err){
   console.log(err);
}

-1

यह कोशिश करो। यह एक टाइपस्क्रिप्ट में लिखा है।

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }

मैं टाइपस्क्रिप्ट में नया हूं। इससे क्या फायदा होता है JSON.parse()?
मार्क एल।

यदि कोई अपवाद हुआ, तो यह इनपुट स्ट्रिंग को स्वयं वापस कर देगा
सुपुन धर्मरत्ने

-1
/**
 * Safely turning a JSON string into an object
 *
 * @param {String} str - JSON String
 * @returns deserialized object, false if error
 */
export function jsonParse(str) {
  let data = null;
  try {
    data = JSON.parse(str);
  } catch (err) {
    return false;
  }
  return data;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.