将工作JavaScript对象序列化为仅保留属性的JSON?
想象一下,我有一个JavaScript类型的继承人,如下所示:将工作JavaScript对象序列化为仅保留属性的JSON?,javascript,json,serialization,Javascript,Json,Serialization,想象一下,我有一个JavaScript类型的继承人,如下所示: function Person( newName ) { this.name = name; this.hats = [] } Person.prototype = { findHat : function( hatName ) { var i=0; for ( i; i< this.hats.length; i++ ) { i
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;
}
let person = JsonMix(data)
.withObject(Person, "Person")
.withObject(Hat, "Person.hats")
.build();
。。。然后以一种获取简单属性并记录对象层次结构(而不是函数)的方式对它们进行序列化,这样我就可以直接将它们反序列化为这些类型,但如果(例如)我想更改findHat
的行为,我可以安全地将存储的数据加载到重新定义的Person
类型中。大概是这样的:
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;
}
let person = JsonMix(data)
.withObject(Person, "Person")
.withObject(Hat, "Person.hats")
.build();
人:{“姓名”:“鲍勃”,“帽子”:[帽子:{“姓名”:“礼帽”,“描述”:“非常聪明”。},帽子:{“姓名”:“羊毛帽”,“描述”:“非常暖和”。}]}
显然,这是一个高度简化的模型,我正在处理现实生活中复杂且潜在的深层对象层次结构,因此,如果我可以避免在我的类上创建任何进一步的类型或手动创建序列化和反序列化方法,那将是理想的
该项目完全是用浏览器中运行的JavaScript编写的,我想要么将数据存储在本地存储中,要么将其发布回服务器,因此我的假设是JSON是实现这一点的自然方式,但我没有使用过大量纯JSON序列化,而且它看起来更喜欢匿名类型,这使得我很难将数据与对象类型关联起来。是否有一种简单的方法(或标准库)来实现这一点,或者我需要将所有内容显式序列化为?两者都可以,让您插入它们正在执行的操作,以便您可以自定义序列化。此外,还可以向类型的原型对象添加一个toJSON
方法,调用该方法将其序列化为JSON,从而完全控制该过程
JSON.stringify
允许您通过两种方式自定义序列化结果:
toJSON
方法,JSON.stringify
使用该方法JSON.parse
允许您指定一个“reviver”函数,该函数本质上是相反的。因此,您可以在原始对象上查找特殊的序列化类型属性,并将其与原始对象数据结合使用来创建类型化对象
我去寻找一个使用这些的例子,然后……呃……嗯……碰巧发现了一些细节。:-) 我不喜欢JSON。*方式是,您需要编写函数,进行序列化/反序列化。我编写了一个小库,它可以使用JSON的构造函数将JSON与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;
}
let person = JsonMix(data)
.withObject(Person, "Person")
.withObject(Hat, "Person.hats")
.build();
我正要问你是否有任何例子——这听起来正是我需要的,谢谢:)