Son zamanlarda aynı sorunu vardı ve bir form aynı yapıya sahip bir JSON nesnesine dönüştüren bu .toJSON jQuery eklentisi ile çıktı . Bu ayrıca, kullanıcınızın belirli yerlere daha fazla alan eklemesine izin vermek istediğiniz dinamik olarak oluşturulmuş formlar için özellikle kullanışlıdır.
Eğer bir temsil için bu formu tahmin edebilirsiniz: nokta aslında bir yapıya kendisi olduğunu, bu yüzden kullanıcı şehirdeki en sevdiği yerleri ekler nerede bir form yapmak istiyorum diyelim böylece bir form inşa etmek isteyebilirsiniz olan <places>...</places>
XML öğesi içeren a kullanıcının beğendiği yerlerin listesi böylece <place>...</place>
her biri örneğin bir <name>...</name>
öğe, bir <type>...</type>
öğe ve ardından <activity>...</activity>
böyle bir yerde gerçekleştirebileceğiniz etkinlikleri temsil eden bir öğe listesi içeren bir öğe listesi . XML yapınız şöyle olur:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
Bu tam yapıyı temsil edecek bir JSON nesnesinin bunun dışında olması ne kadar güzel olurdu, böylece aşağıdakilerden birini yapabilirsiniz:
- Bu nesneyi herhangi bir CouchDB benzeri veritabanında olduğu gibi depolayın
- $ _POST [] sunucu tarafından okuyun ve semantik olarak değiştirebileceğiniz doğru şekilde iç içe diziyi yeniden deneyin
- İyi biçimlendirilmiş bir XML dosyasına dönüştürmek için sunucu tarafı bir komut dosyası kullanın (a-priori'nin tam yapısını bilmeseniz bile)
- Herhangi bir şekilde Node.js benzeri bir sunucu komut dosyasında olduğu gibi kullanın
Tamam, şimdi bir formun bir XML dosyasını nasıl temsil edebileceğini düşünmemiz gerekiyor.
Tabii ki <form>
etiket root
, ama sonra <place>
bir veri elemanı değil, bir kap olan o elemente sahibiz , bu yüzden bunun için bir giriş etiketi kullanamayız.
İşte burada <fieldset>
etiket kullanışlı geliyor! <fieldset>
Etiketleri, form / XML temsilimizdeki tüm kapsayıcı öğelerini temsil etmek için kullanacağız ve böylece şöyle bir sonuç elde edeceğiz:
<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>
Bu formda görebileceğiniz gibi, benzersiz adlar kuralını ihlal ediyoruz, ancak bu tamam, çünkü bir dizi öğeye dönüştürülecekler, böylece sadece dizi içindeki dizinleri tarafından referans verilecekler.
Bu noktada name="array[]"
formun içinde nasıl bir isim olmadığını ve her şeyin güzel, basit ve anlamsal olduğunu görebilirsiniz.
Şimdi bu formun aşağıdaki gibi görünecek bir JSON nesnesine dönüştürülmesini istiyoruz:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Bunu yapmak için burada birisi bu Kod İnceleme iş parçacığında optimize yardımcı ve bu gibi görünüyor bu jQuery eklentisi geliştirdik :
$.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;
};
Bunu daha fazla açıklamak için bu bir blog gönderisini de yaptım .
Bu, bir formdaki her şeyi JSON'a (hatta radyo ve onay kutuları) dönüştürür ve tek yapmanız gereken aramak
$.post('script.php',('form').toJSO(), ...);
Formları JSON nesnelerine dönüştürmenin birçok yolu olduğunu biliyorum .serialize()
ve .serializeArray()
çoğu durumda harika ve harika çalışıyorlar ve çoğunlukla kullanılmayı amaçlıyorlar, ancak bir formu anlamlı isimlerle XML yapısı olarak yazma ve iyi oluşturulmuş JSON nesnesi denemeye değer, aynı zamanda dinamik olarak oluşturulmuş form verilerini yeniden kurtarmanız gerekiyorsa endişe duymadan aynı ad giriş etiketlerini ekleyebilmeniz çok yararlıdır.
Umarım bu birine yardımcı olur!