在使用JSON.stringify后正确地存储在文件中

Store in a file properly after using JSON.stringify

本文关键字:存储 文件 正确地 stringify JSON      更新时间:2023-09-26

这段代码:

function item(name, number){
    this.name = name;
    this.number = number;
}
var item1 = new item('a',1);
var item2 = new item('b',2);
var box1 = [item1,item2];
console.log(box1);
var box2 = JSON.stringify((box1), null, 2);
console.log(JSON.parse(box2));

我得到了输出:

[ item { name: 'a', number: 1 }, item { name: 'b', number: 2 } ]
[ { name: 'a', number: 1 }, { name: 'b', number: 2 } ]

当我试图将box1存储在具有fs.writeFile(filePath, data,...);的文件中时,我使用node得到的结果与第二行相同。
是否有办法把第一个放到json文件中?

简短的回答是:不会自动。JSON不会自动保存对象的prototype

可以这样做,但是你必须自己用一小段代码来处理它。


长答案w/code

在第一个输出[ item {} ]中,item是Node告诉您对象原型是什么的方式。

不幸的是,当您在对象上调用JSON.stringify时,这一点信息将丢失,并且所有的item将成为普通对象。因此,当解析它们返回时,Node不知道这些item应该与new item()一起创建,就像它们最初一样。

"保留"类型的一种快速方法是在每个对象中添加一个新属性,"提示"原型应该是什么,并在解析时显式处理:

function item(name, number){
    this.name = name;
    this.number = number;
    // prototype hint    
    this._prototype = "item";
}
var item1 = new item('a',1);
var item2 = new item('b',2);
var box1 = [item1,item2];
console.log(box1);
var box2 = JSON.stringify((box1), null, 2);
// now map over the items
var parsed = JSON.parse(box2);
var mapped = parsed.map(function(object) {
  if (object._prototype === "item") {
    return new item(object.name, object.number);
  }
  return object;
});
console.log(mapped);

如果您需要更强大的东西,您可以通过将toJSONfromJSON方法添加到item类来扩展此想法,然后在从JSON映射到<->时调用这些方法。

除非编写自己的序列化器,否则不行。幸运的是,一个简单的JSON序列化并不难编写,尽管您必须为使用非标准JSON格式编写解析器将会令人沮丧。

但是,我怀疑这是一个你实际上不想要的情况。JSON是一种与语言无关的数据序列化格式。它存储可以用语言的自然形式表示的数据。在Javascript中,这通常是对象字面量。在Java或。它将是类(pojo/POCOs)。在其他语言中,地图或字典。在对象中包含对象原型的名称,将数据绑定到可能会更改的特定实现。突然间,您甚至不能重命名item函数。这是你不需要的限制。