将工作JavaScript对象序列化为仅保留属性的JSON?

将工作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

想象一下,我有一个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();
。。。然后以一种获取简单属性并记录对象层次结构(而不是函数)的方式对它们进行序列化,这样我就可以直接将它们反序列化为这些类型,但如果(例如)我想更改
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
    使用该方法

  • 它允许您指定一个“replacer”函数,该函数为要序列化的每个项调用,以便您有机会稍微自定义序列化。您可以利用这个机会,在输出对象返回时,使用您希望它具有的类型来标记输出对象

  • 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();
    

    我正要问你是否有任何例子——这听起来正是我需要的,谢谢:)