反向JSON.stringify?

我正在绑定一个对象,如{'foo': 'bar'}

我怎样才能把字符串变回对象?


你需要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);
}

JSON.parseJSON.stringify相反。


JSON.stringifyJSON.parse几乎是JSON.stringify ,并且“通常”这种事情会起作用:

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

所以obj和obj2是“相同的”。

但是要注意一些限制。 在处理简单对象时,这些问题通常不重要。 但我会在这里用这个辅助函数来说明其中的一些:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • 您只会获得对象的ownProperties并丢失原型:

    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
    
  • 你将失去身份:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
    
  • 函数不生存:

    jsonrepack( { f:function(){} } ); // Returns {}
    
  • 日期对象以字符串结尾:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
    
  • 未定义的值不生存:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
    
  • 提供toJSON函数的对象可能无法正确运行。

    x = { f:"foo", toJSON:function(){ return "EGAD"; } }
    jsonrepack(x) // Returns 'EGAD'
    
  • 我确信其他内置类型也存在问题。 (所有这些都是使用node.js进行测试的,因此您可能会根据您的环境获得稍微不同的行为)。

    当它确实很重要时,它有时可以使用JSON.parseJSON.stringify的附加参数来克服。 例如:

    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
    
    链接地址: http://www.djcxy.com/p/48225.html

    上一篇: Reverse of JSON.stringify?

    下一篇: Why getElementsByClassName doesn't work on xhr reponseXML