2009-08-29 6 views

Répondre

6

Le paramètre serialize/serializeArray de jQuery ne fonctionne que pour les éléments de formulaire. Je pense que vous cherchez quelque chose de plus générique comme ceci:

http://code.google.com/p/jquery-json/

Ce plugin rend simple pour la conversion et de 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 

La plupart des gens me demandaient pourquoi je voulez de faire une telle chose, ce qui dépasse mon esprit . Javascript le rend relativement facile à convertir à partir de JSON, grâce à eval(), mais la conversion en JSON est soi-disant une exigence de bord.

Ce plugin expose quatre nouvelles fonctions sur le $, ou objet jQuery:

  • toJSON: sérialise un objet javascript, numéro, chaîne ou Arry en JSON.
  • evalJSON: Convertit JSON en Javascript, rapidement, et est trivial.
  • secureEvalJSON: Transforme de JSON Javascript, mais le fait lors de la vérification pour voir si la source est en fait JSON, et non avec d'autres déclarations Javascript jetés dans
  • quoteString:. Lieux entre guillemets une chaîne, et échappe inteligently toute citation , barre oblique inverse ou caractères de contrôle.
+0

Merci c'est ce que je cherchais :) –

+0

Rappelez-vous que JSON est un sous-ensemble de Javascript - si votre objet Javascript a des fonctions, alors ils ne peuvent pas être stockés dans JSON. Si votre objet contient uniquement des hachages/tableaux/données, JSON est suffisant. –

+0

qu'en est-il de json_decode? http://php.net/manual/fr/function.json-decode.php –

3

Pourquoi, oui: jQuery's serialize. Pour désérialiser, vous devez coder une fonction vous-même, en séparant la chaîne en &, puis les =.

+0

Oh mais cela ne fonctionne que sur les formulaires. Que faire si je veux sérialiser un tableau que je crée en code javascript comme ceci - var array = []; ? –

+0

Vous avez raison, cela ne fonctionne que sur les formulaires - pas sur un tableau. Encore, merci pour les deux upvotes :) – 10goto10

2

je tente de sérialiser une forme, puis l'enregistrer, et lorsque l'utilisateur est revenu à la forme désérialisable et repeupler les données. Il s'avère qu'il existe déjà un joli plugin jQuery pour cela: jQuery autosave. Peut-être que cela aidera certains d'entre vous.

0

J'ai eu le même problème récemment, j'utilisais .serializeArray() jQuery pour poster forme des données pour la validation via un appel AJAX.Je avais besoin sur le côté serveur pour diviser cet objet vers le bas dans un tableau associatif qui reproduirait la structure de données de $ _POST original, donc je l'ai écrit cette petite fonction:

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

Alors tout ce que vous avez à faire est jeté l'objet d'entrée à un type de tableau avant de passer dans l'appel funciton:

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

J'ai aussi écrit une fonction pour analyser la fonction 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

I par à l'instar de la fonction de désérialisation de Chris pour gérer les chaînes sérialisées de jQuery, n'oubliez pas d'urldecode() sur le serveur car des données telles que 'email' => 'me% 40domain.com' viendront si vous utilisez la fonction telle quelle.

Mise à jour:

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

Utilisez la fonction parse_str.

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

parse_str($string, $array); 

description sur php.net

1

Vous devez utiliser la bibliothèque native. Pour IE inférieur à 8, vous devrez également utiliser JSON.js de Crockford.

1

Suivez la variable "formdata" et regardez le code de support pour voir comment cela fonctionne dans un environnement wordpress.

J'utilise ce côté client (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); 
}); 

... et ce sur le côté serveur (PHP) pour récupérer les données sur et dans un joli tableau associatif pour le serveur travail de base de données de côté.

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

Et pour les codeurs WordPress là-bas, il m'a fallu un certain temps pour se rendre compte que le crochet wp_ajax_ devait être dans un fichier de plug-in ou le functions.php de mon thème enfant. Cela ne fonctionnera pas dans un gabarit de page normal!