
06.08.2011, 12:42
|
 |
Люмус, Емаксос Developer!
|
|
Регистрация: 06.05.2010
Сообщений: 677
|
|
Правильный JSON.
Пишу чат в учебных целях. Данные передаются в JSON формате. Есть несколько видов сообщений: сообщение о статусе, входе, выходе и сообщение о новом сообщении. Для каждого вида сообщения есть своя функция обрабатывающая их.
Как правильно сформировать JSON-ответ чтоб на клиенте сработала необходимая функция? JSON должен содержать в себе callback-функцию или может ключ по которому можно идентифицировать к какому типу относится данный ответ? Очень критична скорость.
|
|

06.08.2011, 14:07
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от Magneto
|
Как правильно сформировать JSON-ответ чтоб на клиенте сработала необходимая функция?
|
на сервер отправлять запрос вида: ?key=value&callback
а ответ должен прийти такой:
callback({
key : value
});
т.е. последний ключ, это название функции, которую нужно сформировать на сервере и верунть с нужными параметрами.
|
|

06.08.2011, 14:44
|
 |
Люмус, Емаксос Developer!
|
|
Регистрация: 06.05.2010
Сообщений: 677
|
|
monolithed, дело в том что я не могу говорить серверу какие именно данные я хочу(ожидаю) получить, сервер просто снабжает меня актуальными данными о чате.
За callback спасибо. Я могу впринципе изначально для каждого сообщения навешивать необходимый callback. Но как мне их потом, после получения обрабатывать, чтоб быстро и безопасно?
Вот к примеру такое сообщение пришло:
status({
"from": "Magneto",
"id": "online"
})
Теперь мне нужно вызвать функцию status и передать ей тело сообщения.
|
|

06.08.2011, 15:30
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
(function() {
// в переменную json пришел ответ с сервера
var json = JSON.parse( '{\
"name" : "foo", \
"params" : {\
"key" : 10\
}\
}');
// здесь описываются все функции, названия которых может прийти с сервера
return {
//этот метод не будет вызван, т.к. в текущем ответе json его нет
bar : function(arg) {
return arg;
},
//а это будет
foo : function(arg) {
alert(arg*2);
}
}[json.name](json.params.key);
}());
Последний раз редактировалось monolithed, 06.08.2011 в 17:17.
|
|

06.08.2011, 17:05
|
 |
Люмус, Емаксос Developer!
|
|
Регистрация: 06.05.2010
Сообщений: 677
|
|
monolithed, спасибо. Но я не очень понимаю то что Вы написали.
Как насчет такого варианта:
function reviver(key, value)
{
switch(key)
{
case 'message':
alert('Обрабатываем сообщение.');
break;
case 'status':
alert('Обрабатываем статус: ' + value);
break;
case 'connect':
alert('Присоединение нового пользователя.');
break;
case 'disconnect':
alert('Обрабатываем diconnect.');
break;
}
}
var data = '{"status": "do not disturb"}';
JSON.parse(data, reviver);
|
|

06.08.2011, 17:14
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от Magneto
|
Как насчет такого варианта:
|
Это плохой вариант. А что собственно не понятно в моем примере?
Последний раз редактировалось monolithed, 06.08.2011 в 17:17.
|
|

06.08.2011, 22:35
|
Аспирант
|
|
Регистрация: 09.02.2009
Сообщений: 57
|
|
Я же пользуюсь
str=JSON.stringify(obj);
для преобразование в строку
и
obj=eval('(' + str + ')');
если наоборот.
А зачем использовать JSON.parse() можете разьяснить?
|
|

06.08.2011, 22:47
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
JSON.parse быстрее и безопаснее, потому что не исполняет код, а парсит строку
|
|

07.08.2011, 17:58
|
 |
Люмус, Емаксос Developer!
|
|
Регистрация: 06.05.2010
Сообщений: 677
|
|
Сообщение от monolithed
|
А что собственно не понятно в моем примере?
|
Очень многое непонятно, нопонятно построение этой функции и как ей управлять. Наверняка есть статья на эту тему, дайте ссылку (желательно на русском).
Сообщение от monolithed
|
Это плохой вариант.
|
А почему этот вариант является плохим? Я не сомневаюсь в Вашей компетентности, но для себя я хочу разъяснить.
На данный момент я остановился на JSONP и просто скармливаю его функции eval(). Я понимаю что это небезопасный и медленный способ обработки JSON, но он наверное самый наглядный. Выглядит примерно так:
function message(data)
{
var data = data;
alert('Пришло сообщение: \nОт: ' + data.from + '\nСообщение: ' + data.body);
}
var data = 'message({"from": "Magneto", "body": "Привет мир!"})';
eval('('+ data +')');
Хочу уточнить что чат делаю на Node.js используя WebSockets. Понимаю что в инете пруд пруди подобных чатов, но я намеренно не подглядываю в их исходники.
|
|

07.08.2011, 20:56
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от Magneto
|
Очень многое непонятно, нопонятно построение этой функции и как ей управлять
|
Ок, более понятный пример:
(function() {
// допустим, это ответ с сервера, который содержит название метода и какие-то параметры
var json = JSON.parse('{\
"name" : "foo", \
"params" : {\
"key" : 10\
}\
}');
var foo = new function() {
return {
foo : function(arg) {
return arg * 2;
}
};
};
// вызваем метод объекта foo (или присваиваем как значение к.л. объекту, переменной и т.д.)
alert(foo[json.name](json.params.key));
}());
;
Сообщение от Magneto
|
Наверняка есть статья на эту тему, дайте ссылку (желательно на русском).
|
Возможно где-то есть, я не знаю))
Сообщение от Magneto
|
А почему этот вариант является плохим?
|
switch перебирает значения пока не найдет соответствие, однако можно сразу передать название свойства объекта и вызвать (или присвоить как значение другому объекту).
Сообщение от Magneto
|
На данный момент я остановился на JSONP и просто скармливаю его функции eval().
|
Мы сейчас не говорим, о том как распарить данные, для этого используйте json2
Последний раз редактировалось monolithed, 07.08.2011 в 21:04.
|
|
|
|