用这段代码:
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,...);
的文件中时,我得到的节点与第二行相同。
有没有办法让第一个进入json文件?
答案 0 :(得分:2)
简短的回答是:不会自动。 JSON不会自动保留prototype
个对象。
你可以做到这一点,但你必须自己用一些代码来处理它。
更长的答案w /代码
在您的第一个输出[ item {} ]
中,item
是节点告诉您原型对象的方式。
不幸的是,当您在对象上调用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);
如果您需要更强大的功能,可以通过向toJSON
类添加fromJSON
和item
方法来扩展这一想法,然后在映射到< - &gt时调用这些方法;来自JSON。
答案 1 :(得分:0)
没有编写自己的序列化程序,没有。幸运的是,一个简单的JSON序列化并不难写,尽管您使用非标准JSON格式编写的解析器将会令人沮丧。
但是,我怀疑这是你不想要的情况。 JSON是一种与语言无关的数据序列化格式。它存储的数据可以用语言自然的形式表示。在Javascript中,这通常是对象文字。在Java或.NET中,它将是类(POJO / POCO)。在其他语言中,地图或词典。包含对象名称和对象的原型将您的数据绑定到可能会更改的特定实现。突然间,您甚至无法重命名项目功能。你不需要的限制。