代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

在jQuery中序列化/取消序列化[关闭]

  •  4
  • Richard Knop  · 技术社区  · 15 年前

    这些函数返回数组或对象的字符串表示形式,然后将其解码回数组/对象。

    http://sk2.php.net/serialize

    10 回复  |  直到 15 年前
        1
  •  6
  •   acm    13 年前

    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使其相对稳定 eval(),但无法转换为JSON 应该是边缘要求。

    在$或jQuery对象上:

    • toJSON
    • evalJSON :快速地从JSON转换为Javascript,而且非常简单。
    • secureEvalJSON :从JSON转换为Javascript,但在检查源代码是否为JSON而不是其他Javascript语句时执行此操作。
    • quoteString
        2
  •  3
  •   10goto10    15 年前

    为什么,是的: jQuery's serialize . 要取消序列化,您必须自己编写一个函数,在&'然后是。

        3
  •  2
  •   Will    15 年前

    jQuery autosave . 也许这会帮助你们中的一些人。

        4
  •  1
  •   user661815 user661815    13 年前

    我个人喜欢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;
    }
    
        5
  •  1
  •   kflorence    12 年前

    你应该使用本地语言 JSON 图书馆。对于小于8的IE,您还需要使用Crockford's JSON.js .

        6
  •  1
  •   halfer    9 年前

    遵循变量“formdata”并查看支持代码,了解我是如何在wordpress环境中实现这一点的。

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

    wp_ajax_ 钩子必须位于插件文件或my child主题的functions.php中。它将无法在正常的页面模板中工作!

        7
  •  0
  •   Eugene van der Merwe    14 年前

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

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

        8
  •  0
  •   Chris    13 年前

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

    然后,您只需将输入对象强制转换为数组类型,然后再将其传递到funciton调用中:

    $objData = (array) $_POST['data'];
    $data = unserializeMe($objData);
    
        9
  •  0
  •   Toto    12 年前

    使用函数 parse_str .

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

    关于php.net的描述

        10
  •  0
  •   halfer    9 年前

    .serialize()

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