JSON.stringify 函数

IT技术 javascript json object
2021-03-02 08:52:40

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

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

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

有什么方法可以stringify反对和维护它所拥有的方法吗?

谢谢!

6个回答

有一种方法可以在 JS 中序列化一个函数,但是您必须在另一端对其进行评估,并且它也将无法访问它的原始作用域。一种方法是:

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

尽管人们在这里发布了什么,但您所询问的内容有一些合法用途,但是,这一切都取决于您将要使用它做什么。可能有更好的方法来处理您正在尝试做的任何事情。

如果不是执行隐式toString with return val + '';,而是执行显式 toString则更干净,例如:return val.toString();
2021-04-18 08:52:40
当你在另一边做 eval 时,你会失去这个函数,因为你得到了一个字符串化的函数值给键。
2021-04-20 08:52:40
只有纯封闭表达式才应该被序列化并通过 JSON 发送。这实际上非常强大,可以通过 RPC 发送逻辑,而不仅仅是标量值。接收者还可以在评估之前对 javascript 进行类型检查,同时也可以对其进行沙箱化。用它做一些有趣的事情会模糊代码和数据之间的界限。
2021-04-30 08:52:40
如何在序列化中包含原型?
2021-05-04 08:52:40

实际上,使用方法序列化/解析javascript对象非常容易

看看JSONfn插件。

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

希望这可以帮助。

-瓦迪姆

不会对 getter setter 进行字符串化,也不会在它返回被称为某种对象的对象类型时,而不是我之前定义的类型...
2021-05-15 08:52:40

为什么要对对象进行字符串化?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);
谢谢你的回答!我想添加y(x)到一个onclick事件,所以我必须将整个对象传递给y(),但这似乎不起作用。我想我错过了一些东西..
2021-04-15 08:52:40
终于想通了:element.onclick = function () { return function() { file_onReset(data) } } (); :) 谢谢,您的评论是我需要的火花!
2021-04-26 08:52:40
脚本如下:elem.setAttribute('onchange', "file_onChange(" + data + ");");其中data是上面描述的对象。并且file_onChange()必须接收整个对象..
2021-05-10 08:52:40

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

采取以下措施:

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()可以实现一个浅的字符串化函数;

免责声明在使用之前查看这篇文章和其他文章并做出自己的决定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);

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

@Rolf 您可以在 if 行上方添加此语句 if(obj instanceof Array) return JSON.stringify(obj);
2021-04-22 08:52:40
我怎样才能使这个函数属性字符串化数组?它正在将数组转换为哈希对象。
2021-05-02 08:52:40