Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.06.2012, 02:54
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

XJSONS или как я полторы недели издевался над своим мозгом
Предыстория

Как то довелось мне поработать с php праграммисткой в паре...
Работали над модулем в котором активно перегонялись данные в json, причём количество полей зашкаливало.
Этот опыт натолкнул меня на некоторые мысли...
Позже погуглив, узнал что есть такая штука json shema. Кто бы мог подумать... К тому моменту я уже составил доки для своего формата.

К счастью, все имплементации json схем, что я видел, оказались не совсем тем, что я хотел бы видеть в итоге, да и по размерам не айс...

В общем, начал реализовывать идею сам .

**
Делаю доступной, альфа версию...

Рассмотрим пример(API пока корявое):
[Можно поиграться здесь: http://redjs.org/xjsons/]

var target = {
		general_info: {
			name: 'Archy',
			surname: 'Sharp',
			age: 21,
			location: 'Belarus'
		},
		achievements: [
			{
				distance: 0.1,
				time: 11.3
			},
			{
				distance: 6,
				time: 30
			},
			{
				distance: 10,
				time: 50
			}
		]
	},
	xjsons = _.xjsons('{\
		general_info(general): {\
			(name): s,\
			(surname): s,\
			(age): i,\
			(location): s\
		},\
		achievements(results): [%{\
			(distance): d,\
			(time): d\
		}%]\
	}'),
	processor = _.xjsonsProcessor(xjsons.parse(), target);

processor.error(function(msg) {
	alert(msg);
});

processor.process();

/*
target = {
		general: {
			name: 'Archy',
			surname: 'Sharp',
			age: 21,
			location: 'Belarus'
		},
		results: [
			{
				distance: 0.1,
				time: 11.3
			},
			{
				distance: 6,
				time: 30
			},
			{
				distance: 10,
				time: 50
			}
		]
	}
*/


Что это такое?

target - любой объект(например отправленный сервером)
xjsons - экземпляр парсера xjsons-а
processor - экземпляр обработчика xjsons-а

Синтаксис похож на JSON за исключением:
1. свойства объектов объявляются так targetOldPropName(targetNewPropName)
2. есть конструкция [% .... %] которая задаёт шаблон для значения цели([1, 2, 3] = [%i%]). Обычным массивом[] задаются флаги для св-в с конкретным индексом.

флаги:
i - integer
f - float
d - digit
b - bool
u - undefined
s - string
n - null

флаги-значения:
{ ... }
[ ... ]
[% ... %]

изначально хотел сделать ещё и {% ... %} но постепенно пришёл к выводу, что св-ва объектов лучше определять полностью и конкретно.

Вот собственно в кратце...

В ближайшем будущем доделаю не строгие флаги(в верхнем регистре), которые будут означать, что процессор будет пытаться преобразовать невалидное значение в валидное, а уже потом делать проверку на строгое соответствие.

Мысли, предложения, замечания?

Последний раз редактировалось float, 30.06.2012 в 03:01.
Ответить с цитированием
  #2 (permalink)  
Старый 30.06.2012, 10:48
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

1. как по ссылке играться? есть там подкладка (колбек), чтобы сюда постить результаты экспериментов?
2. в разных браузерах, вроде как, нет точного следования значений в хешах - т.е. порядок может меняться, и в примере general_info может поменяться местами с achievements. у Вашем скрипте это учитывается?
3. зачем это всё - цель какая была? с прмиера я понял, что для быстрой и решительной обработки значений\имен в хешах.
Ответить с цитированием
  #3 (permalink)  
Старый 30.06.2012, 11:50
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

1. По ссылке просто голый билд redJS библиотеки с модулем xjsons.
То есть играться можно в консоли... Какого-то более удобного способа с ходу не придумал.
2. Если я правильно понял, то да.
3. Цель - иметь одну, чётко контролируемую точку взаимодействия с сервером в проектах в высокой изменяемостью.
Грубо говоря:
Завтра бэк-эндер решит поменять general_info на generalInfo, мне в скрипте надо одно слово изменить.
Завтра придет новый бэк-эндер и перепишет свой модуль с нуля. Если у него какие-то недочёты в отсылаемом json-е, все это сразу заметят.

+ Задел на будущее для юнит тестирования.

Последний раз редактировалось float, 30.06.2012 в 12:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск