在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()函数。
我最近遇到了同样的问题,我使用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; }