如何在不获取空对象的情况下进行 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
, true
、false
和 null
。
http://json.org/
【讨论】:
非常感谢。我猜 Person.js 文件看起来应该与常规对象属性不同? @Axel:是的,如果你最终想要序列化数据,数据需要直接在对象上,并且需要是 JSON 支持的有限数据子集的一部分。【参考方案2】:JSON.stringify 不会序列化函数,因为它们不是数据。 JSON 仅存储真实数据及其结构——特别是变量。
如果您还想存储函数,可以使用.toString()
方法将函数源代码转换为字符串,并将其转换回函数,您可以使用 eval() 重新创建方法,但这是一个单独的问题.
您可能必须编写自己的序列化程序来执行此类任务,这个想法非常有趣,如果有现成的解决方案,我不会感到惊讶。
【讨论】:
以上是关于如何在不获取空对象的情况下进行 JSON.stringify 和 JSON.parse?的主要内容,如果未能解决你的问题,请参考以下文章
重构 PHP OOP - 如何在不传递参数的情况下获取对象?
如何在不返回 Promise 的情况下从对象的`get()` 获取异步数据
如何在不指定键值的情况下获取 JSON 对象的最后一个元素?