Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
639 views
in Technique[技术] by (71.8m points)

JSON.stringify()处理一个对象的时候,忽略了对象中的方法,怎么处理

const a = {
    test: 1,
    func() {
        console.log(1111)
    }
}
const b = JSON.stringify(a)
console.log(b) // {"test":1}

如示例,在对一个包含function的对象进行JSON.stringify()时,function会被忽略掉,请问如何解决这种问题


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

JSON 是一种数据的序列化、反序列化方案,而 function 不是数据,就更不是 JSON 的合法内容了。所以被舍弃掉才是正常的,没有“问题”,不需要“解决问题”。

如果你出于某种非常不合理的需求,需要把一个 function 序列化了,可以自己约定一种序列化方式。比如先 toString() 转成字符串;反序列化时 eval

function function2string(obj) {
   if (!(obj instanceof Object))
       throw new Error('不是对象,无法转换。');

   if (obj === null)
       return null;

   const result = {};
   for (let prop in obj) {
       if (typeof obj[prop] === 'object') {
           result[prop] = function2string(obj[prop]);
       } else if (typeof obj[prop] === 'function') {
           result[prop] = {
               '@type': 'function',
               'value': obj[prop].toString()
           }
       } else {
           result[prop] = obj[prop];
       }
   }
   
   return result;
}

const sample = function2string({
   func: function() {
       console.log(a);
   }
});

console.log(JSON.stringify(sample));

反序列化就不写了,反过来 eval 就好了。

注:这种方式仅对自定义函数有效,对 ES 中内置函数无效。

image.png


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...