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


266

मेरे पास जावा सर्वर एप्लिकेशन में एक स्ट्रिंग है जो AJAX का उपयोग करके एक्सेस की जाती है। यह कुछ इस तरह दिखता है:

var json = [{
    "adjacencies": [
        {
          "nodeTo": "graphnode2",
          "nodeFrom": "graphnode1",
          "data": {
            "$color": "#557EAA"
          }
        }
    ],
    "data": {
      "$color": "#EBB056",
      "$type": "triangle",
      "$dim": 9
    },
    "id": "graphnode1",
    "name": "graphnode1"
},{
    "adjacencies": [],
    "data": {
      "$color": "#EBB056",
      "$type": "triangle",
      "$dim": 9
    },
    "id": "graphnode2",
    "name": "graphnode2"
}];

जब स्ट्रिंग सर्वर से खींच ली जाती है, तो क्या इसे जीवित जावास्क्रिप्ट ऑब्जेक्ट (या सरणी) में बदलने का एक आसान तरीका है? या क्या मुझे मैन्युअल रूप से स्ट्रिंग को विभाजित करना और मैन्युअल रूप से अपनी वस्तु का निर्माण करना है?



जवाबों:


397

आधुनिक ब्राउज़र समर्थन करते हैं JSON.parse()

var arr_from_json = JSON.parse( json_string );

ब्राउज़रों कि नहीं है, तो आप शामिल कर सकते हैं पुस्तकालयjson2


उदाहरण के लिए, JSON में दिनांक फ़ील्ड के लिए यह कैसे काम करेगा {StartDate: "/ Date (1372575600000) \"?
फिलिप मुनिन

@PhilippMunin आप इस तारीख फ़ंक्शन का उपयोग जावास्क्रिप्ट एपीआई से कर सकते हैं: नई तिथि (parseInt ("/ Date (946681200000) /"। प्रतिस्थापित करें ('/ दिनांक (', '')))
लियो

या मैप () ऑब्जेक्ट्स आदि, आप कैसे उचित deserialisation करते हैं
इवान

25

JSON का पूरा बिंदु यह है कि JSON तार को बिना कुछ किए देशी वस्तुओं में बदला जा सकता है। इस लिंक को देखें

आप eval(string)या तो उपयोग कर सकते हैं या JSON.parse(string)

हालांकि, evalजोखिम भरा है। Json.org से:

Eval फ़ंक्शन बहुत तेज़ है। हालांकि, यह किसी भी जावास्क्रिप्ट प्रोग्राम को संकलित और निष्पादित कर सकता है, इसलिए सुरक्षा के मुद्दे हो सकते हैं। जब स्रोत विश्वसनीय और सक्षम होता है तो eval के उपयोग का संकेत दिया जाता है। JSON पार्सर का उपयोग करना अधिक सुरक्षित है। XMLHttpRequest पर वेब एप्लिकेशन में, संचार केवल उसी मूल को अनुमति देता है जो उस पृष्ठ को प्रदान करता है, इसलिए यह विश्वसनीय है। लेकिन यह सक्षम नहीं हो सकता है। यदि सर्वर अपने JSON एन्कोडिंग में कठोर नहीं है, या यदि वह अपने सभी इनपुट्स को स्पष्ट रूप से मान्य नहीं करता है, तो यह अमान्य JSON टेक्स्ट वितरित कर सकता है जो खतरनाक स्क्रिप्ट ले जा सकता है। Eval फ़ंक्शन स्क्रिप्ट को निष्पादित करेगा, इसके द्वेष को उजागर करेगा।


1
मैं जोखिम नहीं समझता। किसी को भी किसी भी स्क्रिप्ट को इंजेक्ट करने और निष्पादित करने के लिए एक जेएस डीबगर का उपयोग नहीं किया जा सकता है?
xr280xr

3
@ xr280xr हाँ, लेकिन यह केवल स्थानीय रूप से उनके ब्राउज़र में होता है, वेबसाइट डाउनलोड करने वाले प्रत्येक ब्राउज़र पर नहीं।
मास्टरएक्सिलो

16

जैसे jQuery करता है! (तत्व)

function parseJSON(data) {
    return window.JSON && window.JSON.parse ? window.JSON.parse( data ) : (new Function("return " + data))(); 
}
// testing
obj = parseJSON('{"name":"John"}');
alert(obj.name);

इस तरह आपको किसी बाहरी पुस्तकालय की आवश्यकता नहीं है और यह अभी भी पुराने ब्राउज़रों पर काम करता है।


7
ऐसा लग रहा है कि यह वापस बराबर के लिए गिर रहा है eval()
लार्स

1
यह खतरनाक है, बुराई बुराई है!
caesarsol

8

किसी सरणी के सभी आइटम को इकट्ठा करने के लिए और एक json ऑब्जेक्ट वापस करें

collectData: function (arrayElements) {

        var main = [];

        for (var i = 0; i < arrayElements.length; i++) {
            var data = {};
            this.e = arrayElements[i];            
            data.text = arrayElements[i].text;
            data.val = arrayElements[i].value;
            main[i] = data;
        }
        return main;
    },

उसी डेटा को पार्स करने के लिए हम इस तरह से गुजरते हैं

dummyParse: function (json) {       
        var o = JSON.parse(json); //conerted the string into JSON object        
        $.each(o, function () {
            inner = this;
            $.each(inner, function (index) {
                alert(this.text)
            });
        });

}

4

आप उपयोग भी कर सकते हैं eval()लेकिन JSON.parse()सुरक्षित और आसान तरीका है, तो आप क्यों करेंगे?

अच्छा और काम करता है

var yourJsonObject = JSON.parse(json_as_text);

मुझे कोई कारण नहीं दिखता कि आप क्यों इस्तेमाल करना पसंद करेंगे eval। यह केवल आपके आवेदन को जोखिम में डालता है।

जैसा कि कहा गया है - यह है भी संभव।

बुरा - लेकिन यह भी काम करता है

var yourJsonObject = eval(json_as_text);

evalएक बुरा विचार क्यों है ?

निम्नलिखित उदाहरण पर विचार करें।

कुछ तृतीय पक्ष या उपयोगकर्ता ने JSON स्ट्रिंग डेटा प्रदान किया।

var json = `
[{
    "adjacencies": [
        {
          "nodeTo": function(){
            return "delete server files - you have been hacked!";
          }(),
          "nodeFrom": "graphnode1",
          "data": {
            "$color": "#557EAA"
          }
        }
    ],
    "data": {
      "$color": "#EBB056",
      "$type": "triangle",
      "$dim": 9
    },
    "id": "graphnode1",
    "name": "graphnode1"
},{
    "adjacencies": [],
    "data": {
      "$color": "#EBB056",
      "$type": "triangle",
      "$dim": 9
    },
    "id": "graphnode2",
    "name": "graphnode2"
}]
`;

आपका सर्वर-साइड स्क्रिप्ट उस डेटा को प्रोसेस करता है।

का उपयोग कर JSON.parse:

window.onload = function(){
  var placeholder = document.getElementById('placeholder1');
  placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}

फेंक देंगे:

Uncaught SyntaxError: Unexpected token u in JSON at position X. 

कार्य निष्पादित नहीं किया जाएगा।

आप सुरक्षित है।

का उपयोग कर eval():

window.onload = function(){
  var placeholder = document.getElementById('placeholder1');
  placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}

फ़ंक्शन निष्पादित करेगा और पाठ वापस करेगा।

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

आप सुरक्षित नहीं हैं।

मैं JSON टेक्स्ट स्ट्रिंग में हेरफेर करने में सक्षम था इसलिए यह एक फ़ंक्शन के रूप में कार्य करता है जो सर्वर पर निष्पादित होगा।

eval(JSON)[0].adjacencies[0].nodeTo एक JSON स्ट्रिंग को संसाधित करने की अपेक्षा करता है, लेकिन वास्तव में, हमने अपने सर्वर पर एक फ़ंक्शन निष्पादित किया है।

यह भी रोका जा सकता है अगर हम सर्वर-साइड एक eval()फ़ंक्शन को पास करने से पहले सभी उपयोगकर्ता-प्रदान किए गए डेटा की जांच करते हैं, लेकिन सिर्फ JSON को पार्स करने के लिए अंतर्निहित टूल का उपयोग क्यों नहीं करते हैं और इस सभी परेशानी और खतरे से बचते हैं?


1

और यदि आप भी चाहते हैं कि फंसी हुई वस्तु में फ़ंक्शंस हों, तो आप मेरे छोटे टूल का उपयोग कर सकते हैं: https://github.com/khayll/smix

//first you'll need to define your model
var GraphNode = function() {};
GraphNode.prototype.getType = function() {
   return this.$type;
}

var Adjacency = function() {};
Adjacency.prototype.getData =n function() {
    return this.data;
}

//then you could say:
var result = JSMix(jsonData)
    .withObject(GraphNode.prototype, "*")
    .withObject(Adjacency.prototype, "*.adjacencies")
    .build();

//and use them
console.log(result[1][0].getData());

0

यदि आप html में सर्वर-साइड में स्ट्रिंग चिपकाते हैं, तो आपको कुछ भी करने की आवश्यकता नहीं है:

Jsp में सादे जावा के लिए:

var jsonObj=<%=jsonStringInJavaServlet%>;

Jsp चौड़ाई स्ट्रट्स के लिए:

var jsonObj=<s:property value="jsonStringInJavaServlet" escape="false" escapeHtml="false"/>;

-3

मुझे लगता है कि इससे मदद मिलनी चाहिए:

दस्तावेज़ यह भी साबित करते हैं कि आप json फ़ाइलों के लिए आवश्यकता () का उपयोग कर सकते हैं: https://www.bennadel.com/blog/2908-you-can-use-require-to-load-json-javascript-object-nation-files -इन-नोड js.htm

var jsonfile = require("./path/to/jsonfile.json");
node = jsonfile.adjacencies.nodeTo;
node2 = jsonfile.adjacencies.nodeFrom;
node3 = jsonfile.adjacencies.data.$color;
//other things.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.