gpt4 book ai didi

javascript - 如何从 JSON 恢复原始对象/类型?

转载 作者:可可西里 更新时间:2023-11-01 01:56:15 24 4
gpt4 key购买 nike

使用 eval 或 JSON.parse 很容易将 JSON 加载到 javascript 中的对象中。

但是如果你有一个像函数这样的合适的“类”,你如何将 JSON 数据放入其中呢?

例如

function Person(name) {
this.name=name;
this.address = new Array();
this.friendList;

this.promote = function(){
// do some complex stuff
}
this.addAddress = function(address) {
this.address.push(address)
}
}

var aPersonJSON = '{\"name\":\"Bob\",\"address\":[{\"street\":\"good st\",\"postcode\":\"ADSF\"}]}'

var aPerson = eval( "(" + aPersonJSON + ")" ); // or JSON.parse
//alert (aPerson.name); // Bob
var someAddress = {street:"bad st",postcode:"HELL"};
//alert (someAddress.street); // bad st
aPerson.addAddress(someAddress); // fail!

关键是我需要能够从 JSON 创建适当的 Person 实例,但我所能得到的只是一个哑对象。我想知道是否可以用原型(prototype)做点什么?

我不想解析 JSON 的每一行并将每个变量分配给对应的函数属性,这太困难了。我拥有的实际 JSON 和函数比上面的示例复杂得多。

我假设可以将函数方法 JSONify 化为 JSON 字符串,但由于我需要使结果数据尽可能小,所以这不是一种选择 - 我只想存储和加载数据,而不是 javascript 代码对于方法。

如果可以的话,我也不想将 JSON 加载的数据作为子对象(但可能是唯一的方法),例如

function Person(name) {
this.data = {};
this.data.name=name;
}

var newPerson = new Person("");
newPerson.data = eval( "(" + aPersonJSON + ")" );
alert (newPerson.data.name); // Bob

有什么想法吗?

最佳答案

你需要使用一个reviver函数:

// Registry of types
var Types = {};

function MyClass(foo, bar) {
this._foo = foo;
this._bar = bar;
}
Types.MyClass = MyClass;

MyClass.prototype.getFoo = function() {
return this._foo;
}

// Method which will provide a JSON.stringifiable object
MyClass.prototype.toJSON = function() {
return {
__type: 'MyClass',
foo: this._foo,
bar: this._bar
};
};

// Method that can deserialize JSON into an instance
MyClass.revive = function(data) {
// TODO: do basic validation
return new MyClass(data.foo, data.bar);
};

var instance = new MyClass('blah', 'blah');

// JSON obtained by stringifying an instance
var json = JSON.stringify(instance); // "{"__type":"MyClass","foo":"blah","bar":"blah"}";

var obj = JSON.parse(json, function(key, value) {
return key === '' && value.hasOwnProperty('__type')
? Types[value.__type].revive(value)
: this[key];
});

obj.getFoo(); // blah

真的没有别的办法......

关于javascript - 如何从 JSON 恢复原始对象/类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com