Membalikkan JSON.stringify?

341

Saya mencari-cari objek seperti {'foo': 'bar'}

Bagaimana saya bisa mengembalikan string ke objek?

thelolcat
sumber
6
Perhatikan bahwa {foo: 'bar'}itu bukan JSON yang valid (sementara itu adalah ekspresi javascript yang valid).
Tema
2
cukup coba JSON.parse. jika browser Anda tidak memiliki dukungan maka coba json2.js
Anirudha Gupta
10
kawan kita berurusan dengan lolcat di sini.
Runcing
1
Mungkin saya harus menambahkan jawaban (baca keempat) lainnya yang mengatakan Anda harus melakukan JSON.parse ...
Titouan de Bailleul
33
@RobW, ternyata tautan google Anda menunjuk kembali ke pertanyaan ini sebagai hit teratas. #ironic
Chase Florell

Jawaban:

502

Anda perlu JSON.parse()string.

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

Chase Florell
sumber
8
Kiat pro: selalu masukkan JSON.parse () ke struktur try-catch, karena metode ini dapat membuat Node / Js Anda rusak
Spock
74

JSON.parseadalah kebalikan dari JSON.stringify.

Niet the Dark Absol
sumber
63

JSON.stringifydan JSON.parsehampir oposite, dan "biasanya" hal semacam ini akan berhasil:

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

sehingga obj dan obj2 adalah "sama".

Namun ada beberapa batasan yang harus diperhatikan. Seringkali masalah ini tidak masalah karena Anda berurusan dengan objek sederhana. Tapi saya akan menggambarkan beberapa dari mereka di sini, menggunakan fungsi pembantu ini:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Anda hanya akan mendapatkan ownPropertiesobjek dan kehilangan prototipe:

    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
  • Anda akan kehilangan identitas:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • Fungsi tidak bertahan:

    jsonrepack( { f:function(){} } ); // Returns {}
  • Objek tanggal berakhir sebagai string:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • Nilai yang tidak terdefinisi tidak bertahan:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • Objek yang menyediakan toJSONfungsi mungkin tidak berperilaku benar.

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

Saya yakin ada masalah dengan tipe bawaan lain juga. (Semua ini diuji menggunakan node.js sehingga Anda mungkin mendapatkan perilaku yang sedikit berbeda tergantung pada lingkungan Anda juga).

Ketika itu penting kadang-kadang dapat diatasi dengan menggunakan parameter tambahan JSON.parsedan JSON.stringify. Sebagai contoh:

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
Michael Anderson
sumber
1
Per "JSON adalah format teks yang sepenuhnya bebas bahasa tetapi menggunakan konvensi yang akrab bagi programmer dari keluarga C-bahasa, termasuk C, C ++, C #, Jawa, JavaScript, Perl, Python, dan banyak lainnya." . Bagi saya ini mengatakan bahwa JSON hanya boleh digunakan untuk tipe / data agnostik bahasa. Oleh karena itu, contoh Anda (walaupun sangat valid) hanya terkait dengan JSON dalam kaitannya dengan JavaScript, dan harus lebih didefinisikan sebagai JSONP, dan bukan JSON yang benar ... IMOJSON SPEC
Chase Florell
Salah satu contohnya adalah { bar:"bar" }(dari prototipe Anda) tidak dianggap json valid karena foomerupakan variabel daripada string. Valid json perlu keymenjadi string.
Chase Florell
3
Saya membaca OP dengan mengatakan "Saya mengkonversi objek javascript ke string JSON, dan sekarang saya ingin mengubahnya kembali - bagaimana cara melakukannya?" Semua jawaban lain mengatakan gunakan saja JSON.parse. Saya hanya memperingatkan bahwa ada banyak kasus yang tidak akan ditangani dengan benar. Jika Anda menggunakan data primitif murni (tanpa kelas, prototipe) dan hanya tipe data yang didukung oleh JSON (tanpa tanggal, XML, HTML, dll.) Maka Anda OK.
Michael Anderson
Juga dalam Javascript X = { foo:"bar" }sama dengan X = { "foo":"bar" }yang sama dengan X = {}; X.foo = "bar"yang sama dengan X={}; X["foo"] = "bar"objek yang dihasilkan identik dalam semua 4 kasus. Itu tidak ada bedanya dengan validitas JSON yang dihasilkan.
Michael Anderson
2
Ini adalah jawaban yang luar biasa komprehensif, dan jauh lebih layak menjadi jawaban yang diterima. Terima kasih atas kerja bagus kamu.
scubbo
6

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

Objek JSON asli mencakup dua metode utama.

1. JSON.parse()
2. JSON.stringify() 
  1. The JSON.parse()Metode mem-parsing string JSON - yaitu merekonstruksi objek JavaScript asli

    var jsObject = JSON.parse(jsonString);

  2. Metode JSON.stringify () menerima objek JavaScript dan mengembalikan setara JSON-nya.

    var jsonString = JSON.stringify(jsObject);

Shaik Rasool
sumber
5

Bagaimana dengan ini

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

Ini adalah alternatif yang lebih aman untuk eval.

Pengecualian
sumber
2

Lihat ini.
http://jsfiddle.net/LD55x/

Kode:

var myobj = {};
myobj.name="javascriptisawesome";
myobj.age=25;
myobj.mobile=123456789;
debugger;
var str = JSON.stringify(myobj);
alert(str);
var obj = JSON.parse(str);
alert(obj);
Manish Gupta
sumber
-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();
        }
    });
});
suresh64
sumber