Membalikkan JSON.stringify?


341

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

Bagaimana saya bisa mengembalikan string ke objek?


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


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


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

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



5

Bagaimana dengan ini

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

Ini adalah alternatif yang lebih aman untuk eval.


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

-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();
        }
    });
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.