在jQuery中序列化/反序列化

时间:2009-08-29 19:50:27

标签: php javascript jquery

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

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

http://sk2.php.net/serialize

10 个答案:

答案 0 :(得分:6)

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
     

大多数人问我为什么要这样做   做这样的事情,让我难以置信   心神。 Javascript使它相对   很容易转换为JSON,多亏了   eval(),但转换为JSON是   据说是边缘要求。

     

此插件公开了四个新功能   到$或jQuery对象:

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

更新:

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;
}

答案 4 :(得分:1)

您应该使用原生JSON库。对于小于8的IE,您还需要使用Crockford的JSON.js

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

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

$objData = (array) $_POST['data'];
$data = unserializeMe($objData);

答案 8 :(得分:0)

我还编写了一个解析jQuery .serialize()函数的函数:

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

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

    return $built;
}

答案 9 :(得分:0)

使用函数parse_str

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

parse_str($string, $array);

关于php.net的描述