Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.08.2011, 12:42
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 06.05.2010
Сообщений: 677

Правильный JSON.
Пишу чат в учебных целях. Данные передаются в JSON формате. Есть несколько видов сообщений: сообщение о статусе, входе, выходе и сообщение о новом сообщении. Для каждого вида сообщения есть своя функция обрабатывающая их.

Как правильно сформировать JSON-ответ чтоб на клиенте сработала необходимая функция? JSON должен содержать в себе callback-функцию или может ключ по которому можно идентифицировать к какому типу относится данный ответ? Очень критична скорость.
Ответить с цитированием
  #2 (permalink)  
Старый 06.08.2011, 14:07
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от Magneto
Как правильно сформировать JSON-ответ чтоб на клиенте сработала необходимая функция?
на сервер отправлять запрос вида: ?key=value&callback
а ответ должен прийти такой:
callback({
   key : value
});


т.е. последний ключ, это название функции, которую нужно сформировать на сервере и верунть с нужными параметрами.
Ответить с цитированием
  #3 (permalink)  
Старый 06.08.2011, 14:44
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 06.05.2010
Сообщений: 677

monolithed, дело в том что я не могу говорить серверу какие именно данные я хочу(ожидаю) получить, сервер просто снабжает меня актуальными данными о чате.


За callback спасибо. Я могу впринципе изначально для каждого сообщения навешивать необходимый callback. Но как мне их потом, после получения обрабатывать, чтоб быстро и безопасно?

Вот к примеру такое сообщение пришло:
status({
              "from": "Magneto",
                  "id": "online"
          })


Теперь мне нужно вызвать функцию status и передать ей тело сообщения.
Ответить с цитированием
  #4 (permalink)  
Старый 06.08.2011, 15:30
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 06.08.2011, 17:05
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 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);
Ответить с цитированием
  #6 (permalink)  
Старый 06.08.2011, 17:14
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от Magneto
Как насчет такого варианта:
Это плохой вариант. А что собственно не понятно в моем примере?

Последний раз редактировалось monolithed, 06.08.2011 в 17:17.
Ответить с цитированием
  #7 (permalink)  
Старый 06.08.2011, 22:35
Аспирант
Отправить личное сообщение для mister_maxim Посмотреть профиль Найти все сообщения от mister_maxim
 
Регистрация: 09.02.2009
Сообщений: 57

Я же пользуюсь
str=JSON.stringify(obj);

для преобразование в строку
и
obj=eval('(' + str + ')');

если наоборот.

А зачем использовать JSON.parse() можете разьяснить?
Ответить с цитированием
  #8 (permalink)  
Старый 06.08.2011, 22:47
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

JSON.parse быстрее и безопаснее, потому что не исполняет код, а парсит строку
Ответить с цитированием
  #9 (permalink)  
Старый 07.08.2011, 17:58
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 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. Понимаю что в инете пруд пруди подобных чатов, но я намеренно не подглядываю в их исходники.
Ответить с цитированием
  #10 (permalink)  
Старый 07.08.2011, 20:56
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка JSON menangen AJAX и COMET 0 14.05.2011 16:54
передача JSON на сервер mikeles AJAX и COMET 0 04.03.2011 11:28
Очень нужно.. Отправка HTML куски в JSON от сервера используя Ajax bivnikus jQuery 8 26.10.2010 23:54
jQuery. Обработка ошибок и JSON. mma_mma jQuery 3 19.07.2010 12:10
не работает JSON в JQuery 1.4.1 mcpro jQuery 7 22.03.2010 17:56