একটি জাভাস্ক্রিপ্ট অবজেক্টে একটি JSON ডিসায়রিজ করা


266

আমার কাছে জাভা সার্ভার অ্যাপ্লিকেশনটিতে একটি স্ট্রিং রয়েছে যা এজেএক্স ব্যবহার করে অ্যাক্সেস করা হয়। এটি নীচের মত কিছু দেখাচ্ছে:

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- এ তারিখের ক্ষেত্রগুলির জন্য কাজ করবে, উদাহরণস্বরূপ {স্টার্টডেট: "\ / তারিখ (1372575600000) \ /"}?
ফিলিপ মুনিন

@ ফিলিপমুনিন আপনি জাভাস্ক্রিপ্ট এপিআই থেকে এই তারিখ ফাংশনটি ব্যবহার করতে পারেন: নতুন তারিখ (পার্সিয়ান্ট ("/ তারিখ (946681200000))" "প্রতিস্থাপন ('/ তারিখ (', '')));
লিও

বা মানচিত্র () অবজেক্টস ইত্যাদি, আপনি কীভাবে সঠিক ডিসিসেরিয়ালাইজেশন করবেন
ইওয়ান

25

JSON এর পুরো বিষয়টি হ'ল JSON স্ট্রিংগুলি কিছু না করে দেশীয় বস্তুতে রূপান্তরিত হতে পারে। এই লিঙ্কটি পরীক্ষা করুন

আপনি হয় eval(string)বা ব্যবহার করতে পারেন JSON.parse(string)

তবে evalঝুঁকিপূর্ণ। Json.org থেকে:

Alভাল ফাংশনটি খুব দ্রুত। তবে এটি যে কোনও জাভাস্ক্রিপ্ট প্রোগ্রাম সংকলন ও সম্পাদন করতে পারে, তাই সুরক্ষার সমস্যা হতে পারে। উত্সটি নির্ভরযোগ্য এবং সক্ষম হলে ইওালের ব্যবহার নির্দেশিত হয়। জেএসএন পার্সার ব্যবহার করা অনেক বেশি নিরাপদ। এক্সএমএলএইচটিপিআরকিউস্টের উপরের ওয়েব অ্যাপ্লিকেশনগুলিতে, যোগাযোগটিকে কেবল একই পৃষ্ঠাতে সরবরাহ করা একই উত্সের অনুমতি দেওয়া হয়, সুতরাং এটি বিশ্বাসযোগ্য। তবে এটি সক্ষম নাও হতে পারে। সার্ভার যদি তার JSON এনকোডিংয়ের ক্ষেত্রে কঠোর না হয় বা যদি এটি সমস্ত ইনপুটকে ভ্রষ্টরূপে বৈধতা দেয় না, তবে এটি বিপজ্জনক স্ক্রিপ্ট বহন করতে পারে এমন অবৈধ JSON পাঠ্য সরবরাহ করতে পারে। Alভাল ফাংশনটি স্ক্রিপ্টটি চালায় এবং এর বিদ্বেষ প্রকাশ করবে।


1
আমি ঝুঁকি বুঝতে পারি না। তারা যেভাবে চান কোনও স্ক্রিপ্ট ইনজেকশন এবং কার্যকর করতে কোনও জেএস ডিবাগার ব্যবহার করতে পারে না?
xr280xr

3
@ xr280xr হ্যাঁ, তবে এটি কেবল তাদের ব্রাউজারেই হয়, ওয়েবসাইট ডাউনলোড করা প্রতিটি ব্রাউজারেই নয়।
xilo

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()
LarsH

1
এটি বিপজ্জনক, খারাপ খারাপ!
সিজারসোল

8

একটি অ্যারের সমস্ত আইটেম সংগ্রহ করতে এবং একটি জসন বস্তুটি ফিরিয়ে দিতে

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()ফাংশনে পাসের আগে সমস্ত ব্যবহারকারী-সরবরাহিত ডেটা সার্ভার-সাইড পরীক্ষা করি তবে কেন কেবল জেএসএনকে পার্স করার জন্য অন্তর্নির্মিত সরঞ্জামটি ব্যবহার না করে এবং এই সমস্ত সমস্যা এবং বিপদ এড়ানো উচিত নয়?


1

এবং আপনি যদি ডিসরিয়ালাইজড অবজেক্টের কাজ করতে চান তবে আপনি আমার ছোট সরঞ্জামটি ব্যবহার করতে পারেন: https://github.com/khayll/jsmix

//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

আপনি যদি এইচটিএমএল-তে সার্ভার-সাইডের স্ট্রিংটি পেস্ট করেন তবে কিছু করার দরকার নেই:

জেএসপিতে সরল জাবার জন্য:

var jsonObj=<%=jsonStringInJavaServlet%>;

জেএসপি প্রস্থের স্ট্রুটগুলির জন্য:

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

-3

আমি মনে করি এটির সাহায্য করা উচিত:

এছাড়াও নথিপত্রগুলিও প্রমাণ করে যে আপনি জেসন ফাইলগুলির জন্য প্রয়োজনীয় () ব্যবহার করতে পারেন: https://www.bennadel.com/blog/2908-you-can-use-require-to-load-json-javascript-object-notation-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.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.