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

Serialize a working JavaScript object as JSON retaining only properties?

本文关键字:保留 属性 JSON 工作 JavaScript 对象 序列化      更新时间:2023-09-26

假设我在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.parseJSON.stringify都允许您插入它们正在做的事情,因此您可以自定义序列化。此外,你可以添加一个toJSON方法到你的类型的原型对象,它被调用来序列化到JSON,让你完全控制这个过程。

JSON.stringify允许您以两种方式定制序列化结果:

  1. 如果对象有toJSON方法,则JSON.stringify使用该方法。

  2. 它允许您指定一个"替换"函数,该函数为每个被序列化的项目调用,以便给您一个自定义序列化的机会。您可以将此作为一个机会,将输出对象标记为您希望它返回时具有的类型。

JSON.parse允许您指定一个"恢复"函数,本质上是相反的。因此,您可以在原始对象上查找您的特殊序列化类型属性,并将其与原始对象数据结合使用来创建您的类型化对象。

我去找了一个使用这些的例子,然后…呃…嗯…碰巧在另一个细节问题上找到了自己的答案。: -)

我不喜欢JSON的地方。*的方式是,你需要写函数,做序列化/反序列化。我编写了一个小库,可以使用它的构造函数将JSON与javascript对象混合在一起。在您的情况下,像这样:

let person = JsonMix(data)
  .withObject(Person, "Person")
  .withObject(Hat, "Person.hats")
  .build();
https://www.npmjs.com/package/jsonmix