Tuve el mismo problema últimamente y salí con este complemento .toJSON jQuery que convierte un formulario en un objeto JSON con la misma estructura. Esto también es especialmente útil para formularios generados dinámicamente donde desea permitir que su usuario agregue más campos en lugares específicos.
El punto es que es posible que desee crear un formulario para que tenga una estructura en sí misma, así que supongamos que desea crear un formulario donde el usuario inserte sus lugares favoritos en la ciudad: puede imaginar este formulario para representar un <places>...</places>
elemento XML que contiene un lista de lugares que le gusta al usuario, por lo tanto, una lista de <place>...</place>
elementos que contienen cada uno, por ejemplo, un <name>...</name>
elemento, un <type>...</type>
elemento y luego una lista de <activity>...</activity>
elementos para representar las actividades que puede realizar en dicho lugar. Entonces su estructura XML sería así:
<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é bueno sería tener un objeto JSON fuera de este que representaría esta estructura exacta para que pueda:
- Almacene este objeto como está en cualquier CouchDB base de datos tipo
- Léalo desde el lado del servidor $ _POST [] y recupere una matriz correctamente anidada que luego puede manipular semánticamente
- Utilice algún script del lado del servidor para convertirlo en un archivo XML bien formado (incluso si no conoce su estructura exacta a priori)
- Solo de alguna manera, úselo como está en cualquier script de servidor similar a Node.js
Bien, ahora debemos pensar cómo un formulario puede representar un archivo XML.
Por supuesto, la <form>
etiqueta es la root
, pero luego tenemos que<place>
elemento que es un contenedor y no un elemento de datos en sí mismo, por lo que no podemos usar una etiqueta de entrada para ello.
¡Aquí es donde la <fieldset>
etiqueta es útil! Usaremos <fieldset>
etiquetas para representar todos los elementos del contenedor en nuestra representación de formulario / XML y así llegar a un 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 puede ver en este formulario, estamos rompiendo la regla de los nombres únicos, pero esto está bien porque se convertirán en una matriz de elementos, por lo que solo se referenciará por su índice dentro de la matriz.
En este punto, puede ver cómo no hay name="array[]"
un nombre similar dentro del formulario y todo es bonito, simple y semántico.
Ahora queremos que este formulario se convierta en un objeto JSON que se verá así:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Para hacer esto, he desarrollado este complemento jQuery aquí que alguien ayudó a optimizar en este hilo de Revisión de Código y se ve así:
$.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;
};
También hice esta publicación de blog para explicar esto más.
Esto convierte todo en un formulario a JSON (incluso radio y casillas de verificación) y todo lo que le queda por hacer es llamar
$.post('script.php',('form').toJSO(), ...);
Sé que hay muchas maneras de convertir formularios en objetos JSON y de seguro .serialize()
y .serializeArray()
funcionan muy bien en la mayoría de los casos, y en su mayoría están destinados a ser utilizados, pero creo que esta idea es escribir un formulario como una estructura XML con nombres significativos y convertirlo en un objeto JSON bien formado Vale la pena intentarlo con un , también el hecho de que puede agregar etiquetas de entrada del mismo nombre sin preocuparse es muy útil si necesita recuperar datos de formularios generados dinámicamente.
¡Espero que esto ayude a alguien!