420

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

如何将字符串转回对象?

4

9 回答 9

610

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

于 2012-06-23T18:01:47.730 回答
86

JSON.parse是相反的JSON.stringify

于 2012-06-23T18:01:28.667 回答
76

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
于 2013-05-24T02:33:20.950 回答
7

推荐使用JSON.parse

您可以使用另一种方法:

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

javascript中的json

为什么使用 JavaScript eval 函数是个坏主意?

于 2013-08-13T19:17:12.800 回答
7

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);

于 2014-09-02T08:07:06.847 回答
6

这个怎么样

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

这是一个更安全的替代方案eval

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

于 2013-08-19T20:34:33.933 回答
3

看一下这个。
http://jsfiddle.net/LD55x/

代码:

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);
于 2014-08-05T06:30:43.830 回答
1

这个部分解决方案怎么样?

我想存储(使用配置节点)一个全局 bigobj,带有数据 + 方法(作为导入外部库的替代方法),在我的流程中的许多功能节点中使用:

奇怪但有效:全局变量“bigobj”:

{
some[]more[]{dx:"here"} , // array of objects with  array of objects. The 'Config' node requires JSON.
.....
 "get_dx": "function( d,p) {  return this.some[d].more[p].dx; }"  // test function
}

即函数的 JSON 版本....(都在一行中:()

用途:在功能节点内:

var bigO = global.get("bigobj");

function callJSONMethod(obj, fname, a, b, c, d){
    // see: https://stackoverflow.com/questions/49125059/how-to-pass-parameters-to-an-eval-based-function-injavascript
var wrap = s => "{ return " + obj[fname] + " };" //return the block having function expression
var func = new Function(wrap(obj[fname]));
return func.call( null ).call( obj, a, b, c, d); //invoke the function using arguments
}

msg.payload =callJSONMethod(bigO, "get_dx", 2, 2); 
return msg:

返回“这里”,难以置信!

即我必须使用 bigobj 将函数 callJSONMethod() 添加到任何功能块.....也许可以接受。

最好的祝福

于 2021-01-16T18:46:36.383 回答
-4
$("#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();
        }
    });
});
于 2016-06-04T10:46:55.093 回答