Di recente ho avuto lo stesso problema e sono uscito con questo plugin .toJSON jQuery che converte un modulo in un oggetto JSON con la stessa struttura. Ciò è particolarmente utile per i moduli generati dinamicamente in cui si desidera consentire all'utente di aggiungere più campi in luoghi specifici.
Il punto è che potresti effettivamente voler costruire un modulo in modo che abbia una struttura stessa, quindi diciamo che vuoi creare un modulo in cui l'utente inserisce i suoi luoghi preferiti in città: puoi immaginare questo modulo per rappresentare un <places>...</places>
elemento XML contenente un elenco di luoghi a cui l'utente piace quindi un elenco di <place>...</place>
elementi ciascuno contenente ad esempio un <name>...</name>
elemento, un <type>...</type>
elemento e quindi un elenco di <activity>...</activity>
elementi per rappresentare le attività che è possibile eseguire in tale luogo. Quindi la tua struttura XML sarebbe così:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
Quanto sarebbe bello avere un oggetto JSON da questo che rappresenterebbe questa esatta struttura in modo da poter:
- Conservare questo oggetto così com'è in qualsiasi CouchDB database simile a
- Leggilo dal tuo server $ _POST [] e recupera un array nidificato correttamente che puoi manipolare semanticamente
- Utilizzare alcuni script lato server per convertirlo in un file XML ben formato (anche se non si conosce a priori la sua struttura esatta)
- Usalo in qualche modo così com'è in qualsiasi script server simile a Node.js
OK, quindi ora dobbiamo pensare a come un modulo può rappresentare un file XML.
Ovviamente il <form>
tag è il root
, ma poi abbiamo quello<place>
quell'elemento che è un contenitore e non un elemento di dati stesso, quindi non possiamo usare un tag di input per esso.
Ecco dove il <fieldset>
tag è utile! Useremo i <fieldset>
tag per rappresentare tutti gli elementi contenitore nella nostra rappresentazione modulo / XML e quindi ottenere un risultato come questo:
<form name="places">
<fieldset name="place">
<input type="text" name="name"/>
<select name="type">
<option value="dwelling">Dwelling</option>
<option value="restoration">Restoration</option>
<option value="sport">Sport</option>
<option value="administrative">Administrative</option>
</select>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
</fieldset>
</form>
Come puoi vedere in questo modulo, stiamo infrangendo la regola dei nomi univoci, ma questo è OK perché verranno convertiti in una matrice di elementi, quindi verranno referenziati solo dal loro indice all'interno della matrice.
A questo punto puoi vedere come non esiste name="array[]"
un nome simile all'interno del modulo e tutto è carino, semplice e semantico.
Ora vogliamo che questo modulo sia convertito in un oggetto JSON che assomiglierà a questo:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Per fare questo ho sviluppato questo plugin jQuery qui che qualcuno ha aiutato a ottimizzare in questo thread di revisione del codice e assomiglia a questo:
$.fn.toJSO = function () {
var obj = {},
$kids = $(this).children('[name]');
if (!$kids.length) {
return $(this).val();
}
$kids.each(function () {
var $el = $(this),
name = $el.attr('name');
if ($el.siblings("[name=" + name + "]").length) {
if (!/radio|checkbox/i.test($el.attr('type')) || $el.prop('checked')) {
obj[name] = obj[name] || [];
obj[name].push($el.toJSO());
}
} else {
obj[name] = $el.toJSO();
}
});
return obj;
};
Ho anche pubblicato questo post sul blog per spiegarlo di più.
Questo converte tutto in un modulo in JSON (anche radio e caselle di controllo) e tutto ciò che ti resta da fare è chiamare
$.post('script.php',('form').toJSO(), ...);
So che ci sono molti modi per convertire i moduli in oggetti JSON e sicuro .serialize()
e .serializeArray()
funzionano alla grande nella maggior parte dei casi e sono principalmente destinati ad essere utilizzati, ma penso che tutta questa idea di scrivere un modulo come una struttura XML con nomi significativi e convertirlo in un oggetto JSON ben formato Vale la pena provare un , anche il fatto che sia possibile aggiungere tag di input con lo stesso nome senza preoccuparsi è molto utile se è necessario recuperare i dati dei moduli generati dinamicamente.
Spero che questo aiuti qualcuno!