Indietro di JSON.stringify?


341

Sto stringendo un oggetto come {'foo': 'bar'}

Come posso riportare la stringa in un oggetto?


6
Nota che {foo: 'bar'}non è JSON valido (mentre è un'espressione javascript valida).
saluta il

2
prova semplicemente JSON.parse. se il tuo browser non ha supporto, prova json2.js
Anirudha Gupta il

10
ragazzi abbiamo a che fare con un lolcat qui.
Punta a punta il

1
Forse avrei dovuto aggiungere un'altra (leggi quarta) risposta dicendo che dovresti fare JSON.parse ...
Titouan de Bailleul,

33
@RobW, risulta che il tuo link di Google punta a questa domanda come il successo principale. #ironic
Chase Florell,

Risposte:


502

Hai bisogno JSON.parse()della stringa.

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
Suggerimento pro: inserisci sempre JSON.parse () nelle strutture try-catch, poiché il metodo può causare l'arresto anomalo di Node / Js
Spock


63

JSON.stringifye JSON.parsesono quasi opachi e "di solito" questo genere di cose funzionerà:

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

in modo che obj e obj2 siano "uguali".

Tuttavia ci sono alcune limitazioni da tenere presente. Spesso questi problemi non contano poiché hai a che fare con oggetti semplici. Ma ne illustrerò alcuni qui, usando questa funzione di supporto:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Otterrai solo ownPropertiesl'oggetto e perderai i prototipi:

    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
  • Perderai identità:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • Le funzioni non sopravvivono:

    jsonrepack( { f:function(){} } ); // Returns {}
  • Gli oggetti data finiscono come stringhe:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • I valori indefiniti non sopravvivono:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • Gli oggetti che forniscono una toJSONfunzione potrebbero non comportarsi correttamente.

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

Sono sicuro che ci sono problemi anche con altri tipi predefiniti. (Tutto questo è stato testato usando node.js, quindi potresti avere un comportamento leggermente diverso a seconda del tuo ambiente).

Quando è importante, a volte può essere superato usando i parametri aggiuntivi di JSON.parsee JSON.stringify. Per esempio:

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
Secondo "JSON è un formato di testo che è completamente indipendente dal linguaggio ma utilizza convenzioni familiari ai programmatori della famiglia di linguaggi C, tra cui C, C ++, C #, Java, JavaScript, Perl, Python e molti altri." . Per me questo dice che JSON dovrebbe essere usato solo per tipi / dati agnostici di linguaggio. Pertanto, il tuo esempio (sebbene molto valido) si riferisce solo a JSON nella sua associazione a JavaScript, e dovrebbe essere più definito come JSONP, e non vero JSON ... IMOJSON SPEC
Chase Florell,

Un esempio di ciò è che { bar:"bar" }(dal tuo prototipo) non è considerato json valido poiché fooè una variabile piuttosto che una stringa. Json valido ha bisogno keydi essere un string.
Chase Florell,

3
Ho letto l'OP dicendo "Ho convertito un oggetto javascript in una stringa JSON, e ora voglio riconvertirlo - come posso farlo?" Tutte le altre risposte dicono solo di usare JSON.parse. Sto solo avvertendo che ci sono molti casi che non gestiranno correttamente. Se stai utilizzando dati primitivi puri (senza classi, prototipi) e solo i tipi di dati supportati da JSON (senza date, XML, HTML ecc.), Allora stai bene.
Michael Anderson,

Anche in Javascript X = { foo:"bar" }è lo stesso X = { "foo":"bar" }che è lo stesso X = {}; X.foo = "bar"che è lo stesso come X={}; X["foo"] = "bar"l'oggetto risultante è identico in tutti 4 casi. Ciò non fa alcuna differenza per la validità del JSON generato.
Michael Anderson,

2
Questa è una risposta straordinariamente completa e molto più degna di essere la risposta accettata. Grazie per il tuo eccellente lavoro.
scubbo,

6

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

L'oggetto JSON nativo include due metodi chiave.

1. JSON.parse()
2. JSON.stringify() 
  1. Il JSON.parse()metodo analizza una stringa JSON, ovvero la ricostruzione dell'oggetto JavaScript originale

    var jsObject = JSON.parse(jsonString);

  2. Il metodo JSON.stringify () accetta un oggetto JavaScript e restituisce il suo equivalente JSON.

    var jsonString = JSON.stringify(jsObject);



5

Cosa ne pensi di questo

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

Questa è un'alternativa più sicura per eval.


2

Controllalo.
http://jsfiddle.net/LD55x/

Codice:

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();
        }
    });
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.