JSON.stringify的反向?


337

我正在像一个东西 {'foo': 'bar'}

如何将字符串转换回对象?


6
请注意,这{foo: 'bar'}不是有效的JSON(虽然它是有效的javascript表达式)。
leemes 2012年

2
只需尝试JSON.parse。如果您的浏览器不支持,请尝试json2.js
Anirudha Gupta

10
伙计们,我们在这里与lolcat打交道。
Pointy 2012年

1
也许我应该添加另一个(阅读第四篇)答案说您应该执行JSON.parse ...
Titouan de Bailleul 2012年

33
@RobW,原来您的google链接指向此问题是热门。#ironic
Chase Florell,2012年

Answers:


500

您需要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
专家提示:始终将JSON.parse()放入try-catch结构中,因为该方法可能会使您的Node / Js崩溃
Spock


62

JSON.stringify并且JSON.parse几乎是相反的,并且“通常”这种事情将起作用:

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

1
按照“ JSON是一种完全独立于语言的文本格式,但是使用C语言家族(包括C,C ++,C#,Java,JavaScript,Perl,Python等等)的程序员熟悉的约定。” 。对我来说,这表示JSON仅应用于语言不可知类型/数据。因此,您的示例(虽然非常有效)在与JavaScript的关联中仅涉及JSON,因此应更一般地定义为JSONP,而不是真正的JSON ... IMOJSON SPEC
Chase Florell,

这样的一个例子是{ bar:"bar" }(从您的原型开始)不被认为是有效的json,因为foo它是变量而不是字符串。有效json需要keystring
Chase Florell 2013年

3
我在OP中读到的内容是:“我将javascript对象转换为JSON字符串,现在我想将其转换回-我该怎么做?” 所有其他答案都说只是使用JSON.parse。我只是警告说,有很多情况无法正确处理。如果您使用的是纯原始数据(没有类,原型),并且仅使用JSON支持的数据类型(没有日期,XML,HTML等),那么您就可以了。
迈克尔·安德森

此外,在使用Javascript X = { foo:"bar" }是一样的X = { "foo":"bar" },其是相同的X = {}; X.foo = "bar",其是相同的X={}; X["foo"] = "bar"结果对象是在所有4案件相同。这与生成的JSON的有效性没有区别。
Michael Anderson

2
这是一个非常全面的答案,更值得被接受。感谢您的出色工作。
scubbo,2015年

6

http://jsbin.com/tidob/1/edit?js,控制台,输出

本地JSON对象包括两个关键方法。

1. JSON.parse()
2. JSON.stringify() 
  1. JSON.parse()方法解析一个JSON字符串-即重建原始JavaScript对象

    var jsObject = JSON.parse(jsonString);

  2. JSON.stringify()方法接受一个JavaScript对象并返回其等效的JSON。

    var jsonString = JSON.stringify(jsObject);



5

这个怎么样

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

这是的更安全的选择eval



-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();
        }
    });
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.