-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Эта библиотека - реализация расширения JSON, предложенного dimsmol в статье http://habrahabr.ru/post/224261/
Упор сделан на компактность и использование стандартных механизмов работы с JSON, поэтому используется описанное в статье преобразование синтаксиса.
JSONEX.functions.Date = function(str) {
return new Date(str)
}
JSONEX.parse('{"?": ["Date", "2014-01-01"]}') // Wed Jan 01 2014 00:00:00
var options = {
functions: {
Date: function(str) {
return new Date(str)
}
}
};
JSONEX.parse('{"?": ["Date", "2014-01-01"]}', options) // Wed Jan 01 2014 00:00:00
var parser = new JSONEX.parser ({
functions: {
Date: function(str) {
return new Date(str)
}
}
});
parser.parse('{"?": ["Date", "2014-01-01"]}', options) // Wed Jan 01 2014 00:00:00
Асинхронность включается параметром allow_async: true
. Библиотека совместима с любыми A+ promise. Если хотя бы один из обработчиков вернет promise - то результат parse тоже будет promise.
JSONEX.allow_async = true;
JSONEX.functions.Delay = function(value) {
var d = $.Deferred();
setTimeout(function() { d.resolve(value); }, 1000);
return d.promise();
};
JSONEX.parse('[ "Hello", {"?": ["Delay", "world"] } ]')
.done(function(result) { console.log(result); }); // ["Hello", "world"]
Перед вызовом обработчика, библиотека дожидается получения значения всех его аргументов. Иными словами, обработчик никогда не получит на вход promise, это всегда будет значение.
JSONEX.allow_async = true;
JSONEX.functions.Date = function(str) {
return new Date(str)
}
JSONEX.functions.Delay = function(value) {
var d = $.Deferred();
setTimeout(function() { d.resolve(value); }, 1000);
return d.promise();
};
JSONEX.parse('{"?": ["Date", {"?": ["Delay", "2014-01-01"]}]}')
.done(function(result) { console.log(result); }); // Wed Jan 01 2014 00:00:00
Если же по какой-то причине обработчику нужны на входе именно сырые promise - можно установить для него свойство allow_input_promises
в true
this
внутри обработчика указывает на контекст - объект, создаваемый на каждый вызов parse. Его можно использовать для хранения словаря объектов (может потребоваться для передачи недревовидной структуры объектов):
JSONEX.functions.get = function(key) {
return this[key];
};
JSONEX.functions.set = function(key, value) {
return this[key] = value;
};
JSONEX.functions.set.allow_input_promises = true
Или для учета квот дорогих вызовов. Если требуется определенное начальное состояние контекста - его можно передать в функцию parse третьим аргументом.
Обратное преобразование происходит так же, как и для JSON. Для правильной сериализации объектов, не являющихся словарями, можно использовать метод toJSONEX
. Этот метод должен вернуть другой объект, который будет сериализован вместо заданного.
Чтобы получить вызов функции, надо вернуть объект JSONEX.FunctionCall
:
Date.prototype.toJSONEX = function() {
return JSONEX.FunctionCall("Date", [ this.toString() ]);
};