Вы можете изменить структуру JSON для хранения информации о типе. Если у вас есть много объектов для сериализации и десериализации взад и вперед, это позволит сэкономить время, набирая собственный код для каждого объекта.
Также обратите внимание, что это изменяет структуру JSON и добавляет свойство __type__
для каждого настраиваемого объекта. Я думаю, что это более чистый подход, чем сохранение отдельных файлов конфигурации. Итак, без дальнейших церемоний, вот как это в основном работает:
var fruitBowl = {..};
fruitBowl[0].eat();
fruitBowl[1].seeds[0].plant();
вызов сериализации на объект, чтобы получить JSON Представительские
var json = fruitBowl.serialize();
вызова десериализации на JSON закодированной строки для восстановления объектов
var resurrected = json.deserialize();
Теперь вы можете получить доступ к свойствам и вызовам по объектам:
resurrected[0].eat();
resurrected[1].seeds[0].plant();
Он работает для любых уровней глубоко вложенных объектов, хотя на данный момент это может быть немного ошибкой. Кроме того, это скорее всего не кросс-браузер (проверяется только на Chrome). Поскольку десериализатор не знаком с конструкторской функцией объекта, он в основном создает каждый пользовательский объект без передачи каких-либо параметров. Я установил рабочую демонстрацию на jsfiddle на http://jsfiddle.net/kSATj/1/.
Функция конструктора должен быть изменен, чтобы объяснить двумя способами это объекты могут быть созданы
- непосредственно в Javascript
- Реконструированный из JSON
Все конструкторы должны были бы приспособить создание с обоих концов, поэтому каждому свойству должно быть присвоено значение резервного значения по умолчанию, если ничего не было передано.
function SomeObject(a, b) {
this.a = a || false; // defaultValue can be anything
this.b = b || null; // defaultValue can be anything
}
// one type of initialization that you can use in your code
var o = new SomeObject("hello", "world");
// another type of initialization used by the deserializer
var o = new SomeObject();;
o.a = "hello";
o.b = "world";
Для справки, модифицированное JSON выглядит следующим образом:
{"fruitbowl":
[
{
"__type__": "Fruit",
"name": "apple",
"color": "red",
"seeds": []
},
{
"__type__": "Fruit",
"name": "orange",
"color": "orange",
"seeds":
[
{
"__type__": "Seed",
"size": "small",
"density": "hard"
},
{
"__type__": "Seed",
"size": "small",
"density": "soft"
}
]
}
]
}
Это просто вспомогательная функция для идентификации простых типов:
function isNative(object) {
if(object == null) {
return true;
}
var natives = [Boolean, Date, Number, String, Object, Function];
return natives.indexOf(object.constructor) !== -1;
}
сериализацию объекта в JSON (с типом информации консервы):
Object.prototype.serialize = function() {
var injectTypes = function(object) {
if(!isNative(object)) {
object.__type__ = object.constructor.name;
}
for(key in object) {
var property = object[key];
if(object.hasOwnProperty(key) && !isNative(property)) {
injectTypes(property);
}
}
};
var removeTypes = function(object) {
if(object.__type) {
delete object.__type__;
}
for(key in object) {
var property = object[key];
if(object.hasOwnProperty(key) && !isNative(property)) {
removeTypes(property);
}
}
}
injectTypes(this);
var json = JSON.stringify(this);
removeTypes(this);
return json;
};
Deserialize (с пользовательскими объектами реконструированных):
String.prototype.deserialize = function() {
var rawObject = JSON.parse(this.toString());
var reconstruct = function(object) {
var reconstructed = {};
if(object.__type__) {
reconstructed = new window[object.__type__]();
delete object.__type__;
}
else if(isNative(object)) {
return object;
}
for(key in object) {
var property = object[key];
if(object.hasOwnProperty(key)) {
reconstructed[key] = reconstruct(property);
}
}
return reconstructed;
}
return reconstruct(rawObject);
};
Для дополнительного кредита: в какой-то момент мне может потребоваться определить мои фрукты и семена с помощью «instanceof». –