JSON.stringify tersi mi?


339

Gibi bir nesneyi diziyorum {'foo': 'bar'}

Dizeyi bir nesneye nasıl geri döndürebilirim?


6
{foo: 'bar'}Geçerli bir JSON olmadığını unutmayın (geçerli bir javascript ifadesi olsa da).
leemes

2
sadece JSON.parse komutunu deneyin. tarayıcınızın desteği
yoksa json2.js'yi

10
çocuklar burada bir lolcat ile uğraşıyoruz.
Sivri

1
Belki
de

33
@RobW, google bağlantınızın bu soruyu en çok hit olarak işaret ettiği ortaya çıkıyor. #ironic
Chase Florell

Yanıtlar:


501

Dizeye ihtiyacınız var 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
Pro ipucu: yöntem Düğüm / Js
Spock


62

JSON.stringifyve JSON.parseneredeyse opositlerdir ve "genellikle" bu tür şeyler işe yarar:

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

böylece obj ve obj2 "aynı" olur.

Ancak, bilinmesi gereken bazı sınırlamalar vardır. Basit nesnelerle uğraşırken genellikle bu konular önemli değildir. Ama bu yardımcı işlevi kullanarak bazılarını burada açıklayacağım:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Sadece ownPropertiesnesneyi alır ve prototipleri kaybedersiniz:

    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
  • Kimliğinizi kaybedeceksiniz:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • Fonksiyonlar hayatta kalmaz:

    jsonrepack( { f:function(){} } ); // Returns {}
  • Tarih nesneleri dize olarak sonlanır:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • Tanımsız değerler hayatta kalamaz:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • toJSONİşlev sağlayan nesneler doğru davranmayabilir.

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

Eminim diğer yerleşik tiplerle de sorunlar var. (Tüm bunlar ortamınıza bağlı olarak biraz farklı davranışlar elde edebilmeniz için node.js kullanılarak test edilmiştir).

Önemli olduğunda JSON.parseve ve ek parametrelerini kullanarak bazen aşılabilir JSON.stringify. Örneğin:

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
Başına "JSON tamamen C, C ++, C #, Java, JavaScript, Perl, Python ve diğerleri de dahil olmak üzere dil, C-ailesinin programcılarına tanıdık dil bağımsız ama kullandığı kuralları olan bir metin biçimidir." . Bana göre bu JSON sadece dil agnostik türleri / verileri için kullanılması gerektiğini söylüyor. Bu nedenle, örneğiniz (çok geçerli olsa da) yalnızca JavaScript ile ilişkilendirilmesinde JSON ile ilgilidir ve gerçek JSON değil JSONP olarak tanımlanmalıdır ... IMOJSON SPEC
Chase Florell 26:13

Bunun bir örneği ( { bar:"bar" }prototipinizden) geçerli bir json olarak değerlendirilmemesidir, çünkü foobir dize yerine bir değişkentir. Geçerli json, keya string.
Chase Florell

3
OP bir javascript nesnesini bir JSON dizesine dönüştürdüm ve şimdi geri dönüştürmek istiyorum - nasıl yaparım? Diğer tüm cevaplar sadece kullanın diyor JSON.parse. Sadece doğru şekilde işlemeyecek birçok durum olduğunu uyarıyorum. Saf ilkel veriler (sınıflar, prototipler yok) ve yalnızca JSON tarafından desteklenen veri türleri (tarihler, XML, HTML vb.) Kullanıyorsanız, sorun olmaz demektir.
Michael Anderson

Ayrıca Javascript X = { foo:"bar" }ile aynı X = { "foo":"bar" }olanla X = {}; X.foo = "bar"aynıdır X={}; X["foo"] = "bar"Sonuçta ortaya çıkan nesne 4 durumda da aynıdır. Bu, oluşturulan JSON'un geçerliliği üzerinde hiçbir fark yaratmaz.
Michael Anderson

2
Bu çok kapsamlı bir cevaptır ve kabul edilen cevap olmaya çok daha değerlidir. Mükemmel çalışmanız için teşekkür ederim.
scubbo

6

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

Yerel JSON nesnesi iki anahtar yöntem içerir.

1. JSON.parse()
2. JSON.stringify() 
  1. JSON.parse()Yöntem, bir JSON dizesi ayrıştırır - yani orijinal JavaScript nesneyi oluşturduktan

    var jsObject = JSON.parse(jsonString);

  2. JSON.stringify () yöntemi bir JavaScript nesnesini kabul eder ve JSON eşdeğerini döndürür.

    var jsonString = JSON.stringify(jsObject);



5

Buna ne dersin

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

Bu daha güvenli bir alternatiftir eval.


2

Şuna bir bak.
http://jsfiddle.net/LD55x/

Kod:

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();
        }
    });
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.