serialize / unserialize в jQuery

Есть что-то вроде serialize / unserialize функций PHP в jQuery?

Эти функции возвращают строковые представления массива или объекта, которые могут быть декодированы обратно в массив / объект.

http://sk2.php.net/serialize

Сериализация / serializeArray jQuery работает только для элементов формы. Я думаю, вы ищете нечто более общее:

http://code.google.com/p/jquery-json/

Этот плагин упрощает преобразование в JSON и из него:

var thing = {plugin: 'jquery-json', version: 2.2}; var encoded = $.toJSON(thing); //'{"plugin":"jquery-json","version":2.2}' var name = $.evalJSON(encoded).plugin; //"jquery-json" var version = $.evalJSON(encoded).version; // 2.2 

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

Этот плагин предоставляет четыре новые функции объекту $ или jQuery:

  • toJSON : Сериализует объект javascript, число, строку или arry в JSON.
  • evalJSON : evalJSON конвертируется из JSON в Javascript и является тривиальным.
  • secureEvalJSON : Преобразует из JSON в Javascript, но делает это, проверяя, является ли исходный код фактически JSON, а не с другими вставками Javascript.
  • quoteString : Помещает кавычки вокруг строки и интеллектуально избегает любой цитаты, обратной косой черты или управляющих символов.

Почему, да: сериализация jQuery . Чтобы несериализовать, вам придется самостоятельно закодировать функцию, эссенциально разбивая строку на символах &, а затем на =.

Я пытался сериализовать форму, а затем сохранить ее, и когда пользователь вернется в форму, неэтериализуйте ее и повторно запишите данные. Оказывается, есть довольно сладкий плагин jQuery для этого: jQuery autosave . Может быть, это поможет некоторым из вас.

Мне лично нравится функция unserialize Криса для обработки сериализованных строк jQuery, однако не забывайте также urldecode () их на стороне сервера, так как будут поступать такие данные, как «email» => «me% 40domain.com» если вы используете функцию as-is.

Обновлено:

 function _unserializeJQuery($rubble = NULL) { $bricks = explode('&', $rubble); foreach ($bricks as $key => $value) { $walls = preg_split('/=/', $value); $built[urldecode($walls[0])] = urldecode($walls[1]); } return $built; } 

Вы должны использовать собственную библиотеку JSON . Для IE менее 8 вам также понадобится использовать JSON.js от Crockford .

Следуйте за переменной «formdata» и посмотрите на поддерживающий код, чтобы увидеть, как я получил это, чтобы работать в среде wordpress.

Я использую это на стороне клиента (js):

 // bind button, setup and call .ajax jQuery('#submitbutton').click(function() { jQuery('#response_area').html(''); // put all name-values from form into one long string var serializedformdata = jQuery('#submitform').serialize(); // configure array of options for the ajax call (can use a different action for each form) options = { type: 'POST', url: sv_submitform_global_js_vars.ajaxurl, datatype: 'json', data: { clienttime: getnow(), sv_submit_form_check: jQuery('#sv_submit_form_check').val(), // this data:action:'value' is specifically required by the wordpress wp_ajax_<value> action hook to process the received data on the php/server side action: 'sv_submitform_hook', formdata: serializedformdata, }, beforeSend: beforesendfunc, // process returned json formatted data in function named below success: successfunc, } // execute the ajax call to server (sending data) jQuery.ajax(options); }); 

… и это на стороне сервера (PHP), чтобы получить данные обратно и в хороший ассоциативный массив для работы базы данных на стороне сервера.

 ///////////////////////////////////// // ajax serverside data handler /// ///////////////////////////////////// // Add AJAX actions for submit form // Serves logged in users add_action( 'wp_ajax_sv_submitform_hook', 'sv_submitform_handler' ); // Serves non-logged in users add_action( 'wp_ajax_nopriv_sv_submitform_hook', 'sv_submitform_handler' ); // this is the function that processes the input from the submit form function sv_submitform_handler(){ date_default_timezone_set('EST'); $servertime = date('h:i:s a').' Server Time'; // fda = form data array can be used anywhere after the next statement. // example: if ($fda['formfieldbyname'] == 'something'){...}; parse_str($_POST['formdata'],$fda); // this is how the nonce value is read // form side is wp_nonce_field('sv_submitform','sv_submitform_check'); if (!check_ajax_referer('sv_submitform', 'sv_submitform_check', false )){ $data = $servertime . ' (Security Failed)'; } else { $data = $servertime . ' (Security Passed)'; }; $returndata = array('data' => $data); exit(json_encode($returndata)); }; 

И для кодеров WordPress, мне потребовалось некоторое время, чтобы понять, что wp_ajax_ hook должен быть в файле плагина или в моей функции wp_ajax_ моей дочерней темы. Он не будет работать в обычном шаблоне страницы!

Начиная с версии 1.4.1 jQuery существует встроенная функция jQuery.parseJSON ().

http://api.jquery.com/jQuery.parseJSON/

У меня была такая же проблема в последнее время, я использовал jQuery's .serializeArray () для отправки данных формы для проверки через вызов AJAX. На стороне сервера мне нужно было разделить этот объект на ассоциативный массив, который бы реплицировал исходную структуру данных $ _POST, поэтому я написал эту небольшую функцию:

 функция unserializeMe ($ obj) {
     $ data = array ();
     foreach ($ obj as $ arr) {
         $ data [$ arr ['name']] = $ arr ['value'];
     }
     return $ data;
 }

Затем все, что вам нужно сделать, – это ввести объект ввода в тип массива, прежде чем передавать его в вызове funciton:

 $ objData = (массив) $ _POST ['data'];
 $ data = unserializeMe ($ objData);

Используйте функцию parse_str .

 $array = array(); $string = "title=Hello&desc=World=&s[]=5&s[]=6&s[]=7"; parse_str($string, $array); 

описание на php.net

Я также написал функцию для анализа функции jQuery .serialize() :

 функция createArray ($ rubble) {
     $ bricks = explode ('&', $ rubble);

     foreach ($ bricks as $ key => $ value) {
         $ wall = preg_split ('/ = /', $ value);
         $ built [$ walls [0]] = $ wall [1];
     }

     return $ built;
 }