如何在不获取空对象的情况下进行 JSON.stringify 和 JSON.parse?

Posted

技术标签:

【中文标题】如何在不获取空对象的情况下进行 JSON.stringify 和 JSON.parse?【英文标题】:How to JSON.stringify and JSON.parse without getting an empty object? 【发布时间】:2013-05-05 18:35:53 【问题描述】:

我问这个问题的原因是因为我想为我的对象使用 LocalStorage。您可能知道,在使用 LocalStorage 时,您必须对对象进行 JSON.stringify 处理,然后将它们解析回 javascript 对象。

我正在尝试使用方法对对象进行 JSON.stringify,然后将其解析回来,但我得到的只是一个空对象。

请看一下这段代码。

Person.js

function Person(name, telePhone) 

this.getName = function () 
    return name;


this.setName = function (_name) 
    name = _name;


this.getTelePhone = function () 
    return telePhone;


this.setTelePhone = function (_telePhone) 
    telepPhone = _telePhone;

;

Javascript.js

window.onload = function () 

var name = "John";
var telePhone = "073-2335662";

var personObject = new Person(name, telePhone);

console.log(personObject);
// returns: Person 
console.log(personObject.getName());
//returns: John

var test = JSON.stringify(personObject);
var newPersonObject = JSON.parse(test);

console.log(newPersonObject);
//returns: Object
console.log(newPersonObject.getName());
//returns: Uncaught TypeError: Object #<Object> has no method 'getName'
;

有什么建议为什么 JSON.stringify 和 JSON.parse 之后的这个 Person 对象是空的并且丢失了它的所有方法?

【问题讨论】:

【参考方案1】:

函数不是有效的 JSON 数据类型。当然,函数持有的变量范围是不能序列化的。

您需要将数据直接存储在对象上以对其进行序列化。

JSON 有 "object" (key/value pair) 和 "array" (ordered list) 风格的结构,还有string, number, truefalsenull

http://json.org/

【讨论】:

非常感谢。我猜 Person.js 文件看起来应该与常规对象属性不同? @Axel:是的,如果你最终想要序列化数据,数据需要直接在对象上,并且需要是 JSON 支持的有限数据子集的一部分。【参考方案2】:

JSON.stringify 不会序列化函数,因为它们不是数据。 JSON 仅存储真实数据及其结构——特别是变量。 如果您还想存储函数,可以使用.toString() 方法将函数源代码转换为字符串,并将其转换回函数,您可以使用 eval() 重新创建方法,但这是一个单独的问题.

您可能必须编写自己的序列化程序来执行此类任务,这个想法非常有趣,如果有现成的解决方案,我不会感到惊讶。

【讨论】:

以上是关于如何在不获取空对象的情况下进行 JSON.stringify 和 JSON.parse?的主要内容,如果未能解决你的问题,请参考以下文章

重构 PHP OOP - 如何在不传递参数的情况下获取对象?

如何在不返回 Promise 的情况下从对象的`get()` 获取异步数据

如何在不指定键值的情况下获取 JSON 对象的最后一个元素?

如何在不为每个帖子调用评论对象的情况下从墙上的帖子中获取评论计数?

如何在不使用PHP的循环的情况下获取对象数组的索引

有没有办法在不输入数组 [somenumber] 的情况下获取数组内的特定对象?