在jQuery中序列化/反序列化

是否有像jQuery中序列化/反序列化PHP函数的东西?

这些函数返回数组或对象的字符串表示forms,而不是将其解码回数组/对象。

http://sk2.php.net/serialize

jQuery的serialize / serializeArray仅适用于表单元素。 我想你正在寻找更通用的东西:

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 

大多数人都问我为什么要做这样的事情,这令人难以置信。 由于eval(),Javascript使得从JSON转换相对容易,但转换为JSON应该是边缘要求。

这个插件在$或jQuery对象上公开了四个新函数:

  • toJSON :将javascript对象,数字,字符串或arry序列化为JSON。
  • evalJSON :快速从JSON转换为Javascript,并且是微不足道的。
  • secureEvalJSON :从JSON转换为Javascript,但在检查源是否实际为JSON时是这样做的,而不是引入其他Javascript语句。
  • quoteString :在字符串周围quoteString引号,并且以任意方式转义任何引号,反斜杠或控制字符。

为什么,是的: jQuery的序列化 。 要反序列化,你必须自己编写一个函数,然后将字符串拆分为&,然后是=’s。

我试图序列化一个表单,然后保存它,当用户返回到表单时,将其反序列化并重新填充数据。 事实certificate,有一个非常甜蜜的jQuery插件已经做到这一点: jQuery自动保存 。 也许这会帮助你们中的一些人。

我个人喜欢Chris’unserialize函数来处理jQuery的序列化字符串,但是,不要忘记在服务器端也使用urldecode(),因为’email’=>’me%40domain.com’等数据将会出现如果您按原样使用该function。

更新:

 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库。 对于小于8的IE,您还需要使用Crockford的JSON.js。

按照变量“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_ 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_钩子必须是插件文件或我的子主题的functions.php。 它不适用于普通的页面模板!

从jQuery的1.4.1版本开始,内置了一个jQuery.parseJSON()函数。

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

我最近遇到了同样的问题,我使用jQuery的.serializeArray()通过AJAX调用发布表单数据以进行validation。 在服务器端,我需要将此对象拆分为一个关联数组,该数组将复制原始的$ _POST数据结构,因此我编写了这个小函数:

 function unserializeMe($ obj){
     $ data = array();
     foreach($ obj as $ arr){
         $ data [$ arr ['name']] = $ arr ['value'];
     }
    返回$ data;
 }

然后你要做的就是将输入对象转换为数组类型,然后在funciton调用中传递它:

 $ objData =(array)$ _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()函数:

 function createArray($ rubble){
     $ bricks = explode('&',$ rubble);

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

     return $ built;
 }