Rewers JSON.stringify?

338

Przeszukuję obiekt jak {'foo': 'bar'}

Jak mogę zmienić ciąg z powrotem w obiekt?

thelolcat
źródło
6
Zauważ, że {foo: 'bar'}nie jest prawidłowym JSON (podczas gdy jest to prawidłowe wyrażenie javascript).
leemes
2
po prostu spróbuj JSON.parse. jeśli twoja przeglądarka nie obsługuje, wypróbuj json2.js
Anirudha Gupta
10
chłopaki, mamy tutaj do czynienia z lolcatem.
Pointy
1
Może powinienem był dodać kolejną (przeczytaną czwartą) odpowiedź mówiącą, że powinieneś zrobić JSON.parse ...
Titouan de Bailleul,
33
@RobW okazuje się, że Twój link google wskazuje na to pytanie jako hit. #ironic
Chase

Odpowiedzi:

501

Musisz do JSON.parse()łańcucha.

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
źródło
8
Wskazówka: zawsze wstaw JSON.parse () w struktury try-catch, ponieważ metoda może spowodować awarię twojego Node / Js
Spock
74

JSON.parsejest przeciwieństwem JSON.stringify.

Niet the Dark Absol
źródło
62

JSON.stringifyi JSON.parsesą prawie przeciwieństwami, i „zwykle” tego rodzaju rzeczy będą działać:

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

więc obj i obj2 są „takie same”.

Istnieją jednak pewne ograniczenia, o których należy pamiętać. Często te problemy nie mają znaczenia, gdy masz do czynienia z prostymi przedmiotami. Ale zilustruję tutaj niektóre z nich, korzystając z tej funkcji pomocnika:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Dostaniesz tylko ownPropertiesprzedmiot i stracisz prototypy:

    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
  • Stracisz tożsamość:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • Funkcje nie przetrwają:

    jsonrepack( { f:function(){} } ); // Returns {}
  • Obiekty daty kończą się jako ciągi:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • Nieokreślone wartości nie przetrwają:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • Obiekty zapewniające toJSONfunkcję mogą nie działać poprawnie.

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

Jestem pewien, że występują również problemy z innymi wbudowanymi typami. (Wszystko to zostało przetestowane przy użyciu node.js, więc możesz uzyskać nieco inne zachowanie w zależności od środowiska).

Kiedy ma to znaczenie, czasami można go pokonać, stosując dodatkowe parametry JSON.parsei JSON.stringify. Na przykład:

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
źródło
1
Zgodnie z „JSON jest formatem tekstowym, który jest całkowicie niezależny od języka, ale korzysta z konwencji znanych programistom z rodziny języków C, w tym C, C ++, C #, Java, JavaScript, Perl, Python i wielu innych”. . Według mnie to mówi, że JSON powinien być używany tylko dla typów / danych agnostycznych języka. Dlatego twój przykład (choć bardzo ważny) odnosi się tylko do JSON w powiązaniu z JavaScriptem i powinien być bardziej zdefiniowany jako JSONP, a nie prawdziwy JSON ... IMOJSON SPEC
Chase Florell
Jednym z przykładów jest to, że { bar:"bar" }(z twojego prototypu) nie jest uważany za prawidłowy Json, ponieważ foojest zmienną, a nie łańcuchem. Prawidłowy Json musi keybyć string.
Chase Florell
3
Przeczytałem OP, mówiąc: „Przekształciłem obiekt javascript w ciąg JSON, a teraz chcę go przekonwertować z powrotem - jak to zrobić?” Wszystkie pozostałe odpowiedzi mówią po prostu użyj JSON.parse. Ostrzegam tylko, że istnieje wiele przypadków, które nie będą poprawnie obsługiwane. Jeśli używasz czystych prymitywnych danych (bez klas, prototypów) i tylko typy danych obsługiwane przez JSON (bez dat, XML, HTML itp.), To nic ci nie jest.
Michael Anderson
Również w Javascript X = { foo:"bar" }jest taki sam, X = { "foo":"bar" }który jest taki sam jak X = {}; X.foo = "bar"który jest taki sam jak X={}; X["foo"] = "bar"Obiekt wynikowy jest identyczny we wszystkich 4 przypadkach. Nie ma to znaczenia dla ważności wygenerowanego JSON.
Michael Anderson
2
Jest to niezwykle kompleksowa odpowiedź i zdecydowanie bardziej godna zaakceptowania. Dzięki za świetną pracę.
scubbo
6

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

Natywny obiekt JSON obejmuje dwie kluczowe metody.

1. JSON.parse()
2. JSON.stringify() 
  1. JSON.parse()Metoda analizuje ciąg JSON - czyli odtworzenie oryginalnego obiektu JavaScript

    var jsObject = JSON.parse(jsonString);

  2. Metoda JSON.stringify () akceptuje obiekt JavaScript i zwraca jego odpowiednik JSON.

    var jsonString = JSON.stringify(jsObject);

Shaik Rasool
źródło
5

Co powiesz na to

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

Jest to bezpieczniejsza alternatywa dla eval.

Wyjątek
źródło
2

Spójrz na to.
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);
Manish Gupta
źródło
-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
źródło