JSON.stringify函数

时间:2011-07-19 22:34:07

标签: javascript json object

我有一个具有一些属性和方法的对象,如下所示:

{name: "FirstName",
age: "19",
load: function () {},
uniq: 0.5233059714082628}

我必须将此对象传递给另一个函数。所以我尝试使用JSON.stringify(obj),但是加载函数(当然不是空的,这只是出于本例的目的)正在“丢失”。

有没有办法stringify并反对和维护它拥有的方法?

谢谢!

7 个答案:

答案 0 :(得分:58)

有一种方法可以在JS中序列化一个函数,但是你必须在另一方面评估它,它也将无法访问它的原始范围。一种方法是:

JSON.stringify(objWithFunction, function(key, val) {
  if (typeof val === 'function') {
    return val + ''; // implicitly `toString` it
  }
  return val;
});

尽管人们在这里发布了什么,但是你有什么合理用途,但是,这一切都取决于你将要用它做什么。可能有更好的方式来处理你想要做的事情。

答案 1 :(得分:9)

事实上,使用方法来实现/解析javascript 对象非常容易。

查看 JSONfn 插件。

http://www.eslinstructor.net/jsonfn/

希望这有帮助。

-Vadim

答案 2 :(得分:5)

为什么要确切地对对象进行字符串化? JSON不理解函数(并且它不应该理解)。如果你想传递对象,为什么不通过以下方式之一呢?

var x = {name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628};

function y(obj) {
    obj.load();
}

// works
y({name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628});

// "safer"
y(({name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628}));

// how it's supposed to be done
y(x);

答案 3 :(得分:3)

不是我会做的事情,但值得一提的是,有很多方法可以对函数进行字符串化(即并非不可能)。

采取以下措施:

var func = function(){console.log('logged')};
var strFunc = func.toString();

//then
var parsedFunc = eval('('+strFunc+')');
parsedFunc();

//or simply
eval('('+strFunc+')()');
//or
eval('('+strFunc+')')();
//or
eval('var anotherFunc='+strFunc);
anotherFunc()

上面的重写toJSON()可以实现浅层字符串化功能;

免责声明:查看this及其他文章,并在使用eval()之前做出自己的决定

答案 4 :(得分:1)

JSON.stringify()接受一个JavaScript对象,并将其转换为JSON字符串。

var myObject = { firstName: "Oliver", lastName: "Green", age: 5 };

var myObjectAsString = JSON.stringify(myObject);  
// "{"firstName":"Oliver","lastName":Green,"age":5}"  

typeof(myObjectAsString);  
// "string"  

答案 5 :(得分:0)

这里有一些我在以前的项目中使用的代码,可能有用吗?

  // Similar to JSON.stringify(), with three major differences:
  // (1) It also wrap functions
  // (2) Upon execution, it expose an object, nl, into the scope
  // (3) Results are minified by 'uglify-js'
  var bundle = function(obj) {
    var type = typeof obj;
    if(type === 'string') return '\'' + obj + '\'';
    if(type === 'boolean' || type === 'number') return obj;
    if(type === 'function') return obj.toString();
    var ret = [];
    for(var prop in obj) {
      ret.push(prop + ': ' + bundle(obj[prop]));
    }
    return '{' + ret.join(',') + '}';
  };
  var ret = 'var nl = ' + bundle(nl);
  ret = require('uglify-js').minify(ret, {fromString: true}).code;
  fs.writeFileSync('nl.js', ret);

使用它时的一个警告是,如果函数在外部闭包中使用任何东西,它就不会起作用,即:... obj:{...,key:(function(){... var a = 10; ...返回函数(){...某些代码使用' a' ...})()}

答案 6 :(得分:0)

您可以覆盖 toJSON() 方法,该方法将函数序列化为另一个对象。这是将函数转换为字符串的示例:

Function.prototype.toJSON = Function.prototype.toString;
var o = {name: "FirstName",
age: "19",
load: function () {},
uniq: 0.5233059714082628};

console.log(JSON.stringify(o,null,4))

如果你想打印,比如说,属性描述符:

Function.prototype.toJSON = function() {
    return Object.getOwnPropertyDescriptors(this);
}

var o = {name: "FirstName",
age: "19",
load: function () {},
uniq: 0.5233059714082628};

console.log(JSON.stringify(o,null,4))