将工作JavaScript对象序列化为仅保留属性的JSON
Serialize a working JavaScript object as JSON retaining only properties?
假设我在JavaScript中有一个这样的类型层次结构:
function Person( newName )
{
this.name = name;
this.hats = []
}
Person.prototype = {
findHat : function( hatName ) {
var i=0;
for ( i; i< this.hats.length; i++ )
{
if ( hats[i].name === hatName )
{
return hats[i];
}
}
return { name: "no hat found" };
}
}
function Hat( name, description )
{
this.name= name;
this.description = description;
}
现在我想做的是创建一些实例…
var bob = new Person( "Bob" );
bob.hats.push( new Hat("Top Hat", "Very smart."));
bob.hats.push( new Hat("Wooly Hat", "Very warm."));
…然后序列化他们的方式,得到简单的属性和记录对象层次结构,但不是函数,这样我就可以反序列化他们直接回到那些类型,但如果-例如-我想改变的行为的findHat
我可以加载回我存储的数据到重新定义的Person
类型安全。像这样:
":{"名称":"bob"、"帽子":[帽子:{"名称":"大礼帽"、"描述":"很聪明。"},帽子:{"名称":"毛茸茸的帽子"、"描述":"非常温暖。"}]} "
显然,这是一个高度简化的模型,我在现实生活中处理的是一个复杂的、潜在的深度对象层次结构,所以如果我可以避免创建任何进一步的类型,或者在我的类上手动创建序列化和反序列化方法,那将是理想的。
该项目完全是用浏览器中运行的JavaScript编写的,我想要么将数据存储在本地存储中,要么将其发送回服务器,所以我的假设是JSON是自然的方法,但我没有使用纯JSON序列化很多,它看起来好像它喜欢匿名类型,这将使我很难将数据与对象类型联系起来。是否有一种简单的方法(或标准库)来实现这一点,或者我是否需要设置显式序列化一切,就像几年前那样?
JSON.parse
和JSON.stringify
都允许您插入它们正在做的事情,因此您可以自定义序列化。此外,你可以添加一个toJSON
方法到你的类型的原型对象,它被调用来序列化到JSON,让你完全控制这个过程。
JSON.stringify
允许您以两种方式定制序列化结果:
-
如果对象有
toJSON
方法,则JSON.stringify
使用该方法。 -
它允许您指定一个"替换"函数,该函数为每个被序列化的项目调用,以便给您一个自定义序列化的机会。您可以将此作为一个机会,将输出对象标记为您希望它返回时具有的类型。
JSON.parse
允许您指定一个"恢复"函数,本质上是相反的。因此,您可以在原始对象上查找您的特殊序列化类型属性,并将其与原始对象数据结合使用来创建您的类型化对象。
我去找了一个使用这些的例子,然后…呃…嗯…碰巧在另一个细节问题上找到了自己的答案。: -)
我不喜欢JSON的地方。*的方式是,你需要写函数,做序列化/反序列化。我编写了一个小库,可以使用它的构造函数将JSON与javascript对象混合在一起。在您的情况下,像这样:
let person = JsonMix(data)
.withObject(Person, "Person")
.withObject(Hat, "Person.hats")
.build();
https://www.npmjs.com/package/jsonmix - 使用递归属性迭代保留属性结构
- 如何设置类型化对象的属性,同时保留它's类型
- jQuery深度扩展并保留所有属性
- 保留 SailsJs 服务属性值
- 当使用“”创建时保留函数属性;绑定”;
- 更改 TD 属性并保留从站点提取的数据中获取值
- Javascript子类对象不保留基类的属性/方法
- 什么是保留在挖空扩展中创建的自定义属性的好模式
- 如何使用 CreateJS 的 PreloadJS 来加载图像并保留属性
- 跨用户控件属性设置和保留值
- 如何在组合框中保留值,当使用属性(禁用)时
- 更改属性文本并使用挖空保留输入的值
- 在 JSON.parse() 之后保留属性属性(可写、可配置)
- 如何以两种形式保留文本框属性
- 将 HTML5 数据属性保留在本地存储中
- 将工作JavaScript对象序列化为仅保留属性的JSON
- $的变体.将属性保留为未定义值的扩展
- 在保留键的情况下,基于对象属性对映射进行排序
- 从JSON属性中删除,但保留它们的值
- 替换标记并保留属性