Omgekeerd van JSON.stringify?

I'm stringyfing an object like {'foo': 'bar'}

Hoe kan ik de string terugzetten naar een object?

261
lol coole thx :))
toegevoegd de auteur thelolcat, de bron
@RobW, blijkt dat uw google-link naar deze vraag verwijst als de tophit. #ironisch
toegevoegd de auteur Chase Florell, de bron
Merk op dat {foo: 'bar'} geen geldige JSON is (terwijl het een geldige javascript-expressie is).
toegevoegd de auteur leemes, de bron
@ChaseFlorell - ja, na 5 maanden Google kijken ernaar! ; D
toegevoegd de auteur Chris Kempen, de bron
jongens we hebben hier te maken met een lolcat.
toegevoegd de auteur Pointy, de bron
Misschien had ik een ander (lees vierde) antwoord moeten toevoegen waarin stond dat je JSON.parse moest doen ...
toegevoegd de auteur Titouan de Bailleul, de bron
probeer gewoon JSON.parse. als je browser geen ondersteuning heeft, probeer dan json2.js
toegevoegd de auteur Adrian, de bron

8 antwoord

U moet JSON.parse() de tekenreeks gebruiken.

<div class="snippet" data-lang="js" data-hide="false"> <div class="snippet-code">

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

396
toegevoegd
Pro tip: zet JSON.parse() altijd in try-catch-structuren, omdat de methode je knooppunt/JS kan laten crashen
toegevoegd de auteur Spock , de bron

JSON.parse is the opposite of JSON.stringify.

61
toegevoegd

JSON.stringify and JSON.parse are almost oposites, and "usually" this kind of thing will work:

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

zodat obj en obj2 "hetzelfde" zijn.

Er zijn echter enkele beperkingen waar u rekening mee moet houden. Vaak doen deze kwesties er niet toe, omdat je te maken hebt met eenvoudige objecten. Maar ik zal hier enkele van hen illustreren, gebruikmakend van deze helperfunctie:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • You'll only get ownProperties of the object and lose prototypes:

    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
    
  • You'll lose identity:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo );//false
    
  • Functions dont survive:

    jsonrepack( { f:function(){} } );//Returns {}
    
  • Date objects end up as strings:

    jsonrepack(new Date(1990,2,1));//Returns '1990-02-01T16:00:00.000Z'
    
  • Undefined values dont survive:

    var v = { x:undefined }
    console.log("x" in v);             //true
    console.log("x" in jsonrepack(v)); //false
    
  • Objects that provide a toJSON function may not behave correctly.

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

Ik weet zeker dat er ook problemen zijn met andere ingebouwde typen. (Dit alles is getest met behulp van node.js, dus je kunt ook enigszins ander gedrag vertonen, afhankelijk van je omgeving).

Wanneer het er toe doet, kan het soms worden overwonnen met behulp van de extra parameters van JSON.parse en JSON.stringify . Bijvoorbeeld:

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: , name: 'an object' }
console.log(o.constructor);//[Function: MyClass]
o.dance();                 //I'm dancing

console.log(o2);           //{ date: , name: 'an object' }
console.log(o2.constructor)//[Function: MyClass]        
o2.dance();                //I'm dancing
53
toegevoegd
Per de JSON SPEC "JSON is een tekstindeling die volledig taalonafhankelijk is maar gebruikt conventies die bekend zijn bij programmeurs van de C-familie van talen, waaronder C, C ++, C#, Java, JavaScript, Perl, Python en vele anderen. ". Voor mij zegt dit dat JSON alleen gebruikt moet worden voor taalonafhankelijke typen/data. Daarom heeft uw voorbeeld (hoewel zeer geldig) alleen betrekking op JSON in zijn associatie met JavaScript, en zou het meer zo moeten zijn gedefinieerd als JSONP, en niet als echte JSON ... IMO
toegevoegd de auteur Chase Florell, de bron
Een voorbeeld hiervan is dat {bar: "bar"} (van uw prototype) niet als geldig wordt beschouwd json omdat foo een variabele is in plaats van een tekenreeks. Geldige json heeft de -code nodig om een ​​ -reeks te zijn.
toegevoegd de auteur Chase Florell, de bron
Ik lees het OP als volgt: "Ik heb een javascript-object geconverteerd naar een JSON-tekenreeks en nu wil ik het terug converteren - hoe doe ik dat?" Alle andere antwoorden zeggen gewoon gebruik JSON.parse . Ik waarschuw alleen dat er veel gevallen zijn die niet goed zullen werken. Als u pure primitieve gegevens (geen klassen, prototypen) en alleen de datatypes die door JSON worden ondersteund (geen datums, XML, HTML enz.) Gebruikt, dan bent u in orde.
toegevoegd de auteur Michael Anderson, de bron
Ook in Javascript X = {foo: "bar"} is hetzelfde als X = {"foo": "bar"} wat hetzelfde is als X = {}; X.foo = "bar" wat hetzelfde is als X = {}; X ["foo"] = "bar" Het resulterende object is in alle 4 gevallen identiek. Dat maakt geen verschil voor de geldigheid van de gegenereerde JSON.
toegevoegd de auteur Michael Anderson, de bron
@ MA-Maddin je hebt gelijk dat het jsonrepack (nieuwe datum (1990,2,1)); zou moeten zijn en dat heb ik gecorrigeerd. De reden dat je een verschil ziet in de uitvoer voor die case is de tijdzone die je gebruikt anders is dan die van mij - en new Date (1990,2,1) is de datum voor 1 februari 1990 in de UTC tijdzone.
toegevoegd de auteur Michael Anderson, de bron
noch jsonrepack (nieuwe datum (1,2,1990)); noch jsonrepack (nieuwe datum (1990,2,1)); retourneert '1990-02 -01T16: 00: 00.000Z ' voor mij, maar ' 1906-08-10T22: 00: 00.000Z ' en ' 1990-02-28T23: 00: 00.000Z ': P
toegevoegd de auteur MA-Maddin, de bron
Dit is een buitengewoon veelomvattend antwoord en veel waardiger om het geaccepteerde antwoord te zijn. Bedankt voor je uitstekende werk.
toegevoegd de auteur scubbo, de bron
Geweldig antwoord - grondige en mooie QED. Het waarschuwde me ook voor een specifieke hobbel op de weg die ik zeker zou raken. Bedankt dat je die extra mijl hebt genomen.
toegevoegd de auteur jwolf, de bron

Wat denk je hiervan

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

Dit is een veiliger alternatief voor eval .

<div class="snippet" data-lang="js" data-hide="true"> <div class="snippet-code snippet-currently-hidden">

var stringifiedJSON = '{"hello":"world"}';
var parsed = new Function('return ' + stringifiedJSON)();
alert(parsed.hello);
</div> </div>

5
toegevoegd

Aanbevolen is om JSON.parse te gebruiken

Er is een alternatief dat je kunt doen:

 var myObject = eval('(' + myJSONtext + ')');

Json in JavaScript

Waarom is het gebruik van de JavaScript-eval-functie een slecht idee?

5
toegevoegd
dit is mogelijk een beetje kwetsbaarder voor code-manipulatie
toegevoegd de auteur matanster, de bron

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

Het native JSON-object bevat twee belangrijke methoden.

1. JSON.parse()
2. JSON.stringify() 
  1. The JSON.parse() method parses a JSON string - i.e. reconstructing the original JavaScript object

    var jsObject = JSON.parse(jsonString);

  2. JSON.stringify() method accepts a JavaScript object and returns its JSON equivalent.

    var jsonString = JSON.stringify(jsObject);

5
toegevoegd

Check this out.
http://jsfiddle.net/LD55x/

Code:

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);
2
toegevoegd
$("#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();
        }
    });
});
2
toegevoegd