2009-08-29 138 views

回答

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對象,數字,字符串,或者哈利成JSON。
  • evalJSON:從JSON轉換爲Javascript,很快,而且很簡單。
  • secureEvalJSON:從JSON轉換爲JavaScript中,但這樣做的同時檢查是否源實際上是JSON,而不是在拋出的JavaScript語句
  • quoteString:地方轉轉字符串報價和inteligently逃逸的任何報價,反斜槓或控制字符。
+0

感謝這就是我正在尋找:) – 2009-08-29 20:37:14

+0

記住,JSON是Javascript的一個子集 - 如果你的Javascript對象有它的功能,那麼他們不能存儲在JSON中。如果你的對象只包含哈希/數組/數據,那麼JSON就足夠了。 – 2010-08-31 11:21:02

+0

json_decode怎麼樣? http://php.net/manual/en/function.json-decode.php – 2012-11-14 16:17:15

3

爲什麼,是:jQuery's serialize。爲了反序列化,你必須自己編寫一個函數,實際上將字符串分割爲&,然後是=。

+0

哦,但它只適用於窗體。如果我想序列化一個在javascript代碼中創建的數組,如下所示 - var array = []; ? – 2009-08-29 20:01:46

+0

你是對的,它只適用於表單 - 不適用於數組。仍然,感謝這兩個upvotes :) – 10goto10 2009-08-29 21:50:11

2

我試圖序列化表單,然後保存,當用戶返回到窗體反序列化,並重新填充數據。事實證明,已經有一個相當漂亮的jQuery插件了:jQuery autosave。也許這會幫助你們中的一些人。

0

最近我有同樣的問題,我是用jQuery的.serializeArray()發佈通過AJAX調用形成驗證數據。在服務器端,我需要向下拆分此對象爲關聯數組,將複製原來的$ _ POST數據結構,所以我寫了這個小功能:

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

然後,所有你需要做的就是投輸入對象到一個數組類型傳遞給它的功能可按呼叫之前:

 
$objData = (array) $_POST['data']; 
$data = unserializeMe($objData); 
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; 
} 
1

我每聲音像Chris的反序列化函數來處理jQuery的序列化字符串,但是,不要忘記在服務器端也需要urldecode(),因爲像'email'=>'me%40domain.com'這樣的數據將會進入if您按原樣使用該功能。

更新時間:

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

使用功能parse_str

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

parse_str($string, $array); 

上php.net

1

你應該使用本地庫描述。對於少於8的IE,您還需要使用Crockford的JSON.js

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中。它不會在普通的頁面模板中工作!