Eu tive o mesmo problema recentemente e criei este plugin .toJSON jQuery que converte um formulário em um objeto JSON com a mesma estrutura. Isso também é especialmente útil para formulários gerados dinamicamente, nos quais você deseja permitir que o usuário adicione mais campos em locais específicos.
O ponto é que você pode realmente criar um formulário para que ele tenha uma estrutura própria; digamos que você queira criar um formulário no qual o usuário insira seus lugares favoritos na cidade: você pode imaginar esse formulário para representar um <places>...</places>
elemento XML contendo um lista de locais que o usuário gosta, portanto, uma lista de <place>...</place>
elementos, cada um contendo, por exemplo, um <name>...</name>
elemento, um <type>...</type>
elemento e, em seguida, uma lista de <activity>...</activity>
elementos para representar as atividades que você pode executar em um local como esse. Portanto, sua estrutura XML seria assim:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
Quão legal seria ter um objeto JSON disso, que representaria essa estrutura exata, para que você seja capaz de:
- Armazene esse objeto como em qualquer banco de dados semelhante ao CouchDB
- Leia-o no lado do servidor $ _POST [] e recupere uma matriz aninhada corretamente que você pode manipular semanticamente
- Use algum script do lado do servidor para convertê-lo em um arquivo XML bem formado (mesmo que você não conheça a estrutura exata a priori)
- De alguma forma, use-o como em qualquer script de servidor semelhante ao Node.js.
OK, agora precisamos pensar em como um formulário pode representar um arquivo XML.
É claro que a <form>
tag é o root
, mas temos o <place>
elemento que é um contêiner e não o próprio elemento de dados; portanto, não podemos usar uma tag de entrada para ele.
Aqui é onde a <fieldset>
tag é útil! Usaremos <fieldset>
tags para representar todos os elementos do contêiner em nosso formulário / representação XML e, assim, obter um resultado como este:
<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>
Como você pode ver neste formulário, estamos violando a regra dos nomes exclusivos, mas tudo bem, porque eles serão convertidos em uma matriz de elemento e, portanto, serão referenciados apenas pelo índice dentro da matriz.
Nesse ponto, você pode ver como não existe name="array[]"
um nome semelhante no formulário e tudo é bonito, simples e semântico.
Agora queremos que este formulário seja convertido em um objeto JSON que se parecerá com isso:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Para fazer isso, desenvolvi este plugin jQuery aqui, que alguém ajudou a otimizar neste segmento de Revisão de código e fica assim:
$.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;
};
Eu também fiz este post para explicar mais isso.
Isso converte tudo em um formulário para JSON (mesmo caixas de seleção e rádio) e tudo o que você precisa fazer é chamar
$.post('script.php',('form').toJSO(), ...);
Eu sei que há muitas maneiras de formas converter em objetos JSON e seguro .serialize()
e .serializeArray()
trabalho grande na maioria dos casos e destinam-se principalmente a ser utilizado, mas eu acho que toda essa ideia de escrever um formulário como uma estrutura XML com nomes significativos e convertê-lo em um objeto JSON bem formado vale a pena tentar, também o fato de poder adicionar tags de entrada com o mesmo nome sem se preocupar é muito útil se você precisar recuperar dados de formulários gerados dinamicamente.
Espero que isso ajude alguém!