繁体   English   中英

JSON.stringify function

[英]JSON.stringify function

我有一个 object 有一些属性和方法,像这样:

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

我必须将这个 object 传递给另一个 function。 所以我尝试使用 JSON.stringify(obj) 但是负载 function (当然不是空的,这只是为了这个例子的目的)正在“丢失”。

有什么方法可以对 object 进行stringify并维护它的方法吗?

谢谢!

有一种方法可以在 JS 中序列化 function,但您必须在另一侧对其进行评估,并且它也将无法访问其原始 scope。 一种方法是:

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

尽管人们在这里发布了什么,但您所询问的内容仍有一些合法用途,但是,这完全取决于您将使用它的目的。 无论您尝试做什么,都可能有更好的方法。

事实上,使用方法很容易实现/解析 javascript object

看看JSONfn插件。

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

希望这可以帮助。

-瓦迪姆

为什么要对 object 进行字符串化? 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);

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

采取以下措施:

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()可以实现浅字符串化 function;

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

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

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

使用它时需要注意的是,如果 function 在外部闭包中使用任何东西,它将不起作用,即:... obj: {..., key: (function() {...var a = 10;. .. return function() {... some code uses 'a'...})()}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM