JSON.stringify का उलटा?


338

मैं एक वस्तु की तरह stringyfing कर रहा हूँ {'foo': 'bar'}

मैं स्ट्रिंग को किसी ऑब्जेक्ट में वापस कैसे ला सकता हूं?


6
ध्यान दें कि {foo: 'bar'}वैध JSON नहीं है (जबकि यह एक मान्य जावास्क्रिप्ट अभिव्यक्ति है)।
leemes

2
बस JSON.parse का प्रयास करें। अगर आपके ब्राउज़र का कोई सपोर्ट नहीं है, तो json2.js
Gupta

10
हम यहाँ एक लोलकट के साथ काम कर रहे हैं।
पोइंट्टी

1
हो सकता है कि मुझे एक और (चौथा पढ़ा हुआ) उत्तर देना चाहिए था जिसमें कहा गया था कि आपको JSON.parse करना चाहिए ...
टिटौयन डी बेलील

33
@RobW, यह बताता है कि आपका Google लिंक इस प्रश्न पर शीर्ष हिट के रूप में वापस आता है। # यूरिक
चेस फ्लोरल

जवाबों:


501

आपको JSON.parse()स्ट्रिंग की आवश्यकता है ।

var str = '{"hello":"world"}';
try {
  var obj = JSON.parse(str); // this is how you parse a string into JSON 
  document.body.innerHTML += obj.hello;
} catch (ex) {
  console.error(ex);
}


8
प्रो टिप: हमेशा JSON.parse () को ट्राई-कैच संरचनाओं में डालें, क्योंकि यह विधि आपके नोड / Js को क्रैश कर सकती है
Spock


62

JSON.stringifyऔर JSON.parseलगभग ऑपोसिट हैं, और "आमतौर पर" इस ​​तरह की चीज काम करेगी:

var obj = ...;
var json = JSON.stringify(obj);  
var obj2 = JSON.parse(json);

ताकि obj और obj2 "समान" हों।

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

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • आप केवल ownPropertiesवस्तु प्राप्त करेंगे और प्रोटोटाइप खो देंगे:

    var MyClass = function() { this.foo="foo"; } 
    MyClass.prototype = { bar:"bar" }
    
    var o = new MyClass();
    var oo = jsonrepack(o);
    console.log(oo.bar); // undefined
    console.log( oo instanceof MyClass ); // false
  • आप पहचान खो देंगे:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • कार्य न बचे:

    jsonrepack( { f:function(){} } ); // Returns {}
  • दिनांक ऑब्जेक्ट स्ट्रिंग के रूप में समाप्त होते हैं:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • अपरिभाषित मान न बचे:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • toJSONफ़ंक्शन प्रदान करने वाली वस्तुएँ सही तरीके से व्यवहार नहीं कर सकती हैं।

    x = { f:"foo", toJSON:function(){ return "EGAD"; } }
    jsonrepack(x) // Returns 'EGAD'

मुझे यकीन है कि अन्य अंतर्निहित प्रकार के साथ भी समस्याएं हैं। (यह सब नोड.जेएस का उपयोग करके परीक्षण किया गया था ताकि आपको अपने वातावरण के आधार पर थोड़ा अलग व्यवहार मिल सके)।

जब यह फर्क पड़ता है यह कभी कभी के अतिरिक्त पैरामीटर का उपयोग कर दूर किया जा सकता JSON.parseहै और JSON.stringify। उदाहरण के लिए:

function MyClass (v) {
   this.date = new Date(v.year,1,1);
   this.name = "an object";
};

MyClass.prototype.dance = function() {console.log("I'm dancing"); }

var o = new MyClass({year:2010});
var s = JSON.stringify(o);

// Smart unpack function
var o2 = JSON.parse( s, function(k,v){
  if(k==="") { 
     var rv = new MyClass(1990,0,0);
     rv.date = v.date;
     rv.name = v.name;
     return rv
  } else if(k==="date") {
    return new Date( Date.parse(v) );
  } else { return v; } } );

console.log(o);             // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o.constructor); // [Function: MyClass]
o.dance();                  // I'm dancing

console.log(o2);            // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o2.constructor) // [Function: MyClass]        
o2.dance();                 // I'm dancing

1
" प्रति के रूप में JSON एक पाठ प्रारूप है जो पूरी तरह से भाषा स्वतंत्र है, लेकिन ऐसे सम्मेलनों का उपयोग करता है जो सी, सी ++, सी #, जावा, जावास्क्रिप्ट, पर्ल, पायथन, और कई अन्य सहित भाषाओं के सी-परिवार के प्रोग्रामर से परिचित हैं।" । मेरे लिए यह कहता है कि JSON का उपयोग केवल भाषा अज्ञेय प्रकार / डेटा के लिए किया जाना चाहिए। इसलिए, आपका उदाहरण (जबकि बहुत मान्य) केवल जावास्क्रिप्ट में JSON से संबंधित है, और इसे JSONP के रूप में अधिक-परिभाषित किया जाना चाहिए, और सही JSON नहीं ... IMOJSON SPEC
चेस फ्लोरल

इसका एक उदाहरण यह है कि { bar:"bar" }(आपके प्रोटोटाइप से) एक वैधfoo स्ट्रिंग नहीं माना जाता है क्योंकि एक स्ट्रिंग के बजाय एक चर है। वैध जॅसन की जरूरत keyहै string
चेस फ्लोरल

3
मैंने ओपी को यह कहते हुए पढ़ा कि "मैंने एक जावास्क्रिप्ट ऑब्जेक्ट को JSON स्ट्रिंग में बदल दिया है, और अब मैं इसे वापस बदलना चाहता हूं - मैं इसे कैसे करूं?" अन्य सभी उत्तर कहते हैं कि बस उपयोग करें JSON.parse। मैं सिर्फ चेतावनी दे रहा हूं कि बहुत सारे मामले हैं जो सही तरीके से नहीं निपटेंगे। यदि आप शुद्ध आदिम डेटा (कोई वर्ग, प्रोटोटाइप नहीं) और केवल JSON (कोई दिनांक, XML, HTML आदि) द्वारा समर्थित डेटाटिप्स का उपयोग कर रहे हैं तो आप ठीक हैं।
माइकल एंडरसन

इसके अलावा जावास्क्रिप्ट भी X = { foo:"bar" }वही है X = { "foo":"bar" }जो वही है X = {}; X.foo = "bar"जो X={}; X["foo"] = "bar"सभी 4 मामलों में समान है। इससे उत्पन्न JSON की वैधता पर कोई फर्क नहीं पड़ता है।
माइकल एंडरसन

2
यह एक उत्कृष्ट व्यापक उत्तर है, और स्वीकृत उत्तर होने के योग्य है। आपके उत्कृष्ट कार्य के लिए धन्यवाद।
scubbo

6

http://jsbin.com/tidob/1/edit?js,console,output

देशी JSON ऑब्जेक्ट में दो प्रमुख विधियाँ शामिल हैं।

1. JSON.parse()
2. JSON.stringify() 
  1. JSON.parse()विधि JSON स्ट्रिंग को पार्स करता है - यानी मूल जावास्क्रिप्ट वस्तु के पुनर्निर्माण

    var jsObject = JSON.parse(jsonString);

  2. JSON.stringify () विधि एक जावास्क्रिप्ट ऑब्जेक्ट को स्वीकार करती है और अपने JSON के बराबर लौटाती है।

    var jsonString = JSON.stringify(jsObject);



5

इस बारे में कैसा है

var parsed = new Function('return ' + stringifiedJSON )();

यह एक सुरक्षित विकल्प है eval



-3
$("#save").click(function () {
    debugger
    var xx = [];
    var dd = { "firstname": "", "lastname": "", "address": "" };
    var otable1 = $("#table1").dataTable().fnGetData();

    for (var i = 0; i < otable1.length; i++) {
        dd.firstname = otable1[i][0];
        dd.lastname = otable1[i][1];
        dd.address = otable1[i][2];
        xx.push(dd);
        var dd = { "firstname": "", "lastname": "", "address": "" };
    }
    JSON.stringify(alert(xx));
    $.ajax({

        url: '../Home/save',
        type: 'POST',
        data: JSON.stringify({ u: xx }),
        contentType: 'application/json;',
        dataType: 'json',
        success: function (event) {
            alert(event);
            $("#table2").dataTable().fnDraw();
            location.reload();
        }
    });
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.