2010-09-09 5 views
19

Bunun için saatlerce arama yaptım ve bir cevap bulamadık. Lütfen alev almadan önce tüm soruları okuyun! :) JSQ nesnesine JSON nesnesini seri hale getirme jQuery

Ben buna benzer bir form var:

<form id="sample"> 
<input name="name" type="text" value="name value" /> 

<input name="phone[0][type]" type="text" value="cell" /> 
<input name="phone[0][number]" type="text" value="000" /> 

<input name="phone[1][type]" type="text" value="home" /> 
<input name="phone[1][number]" type="text" value="111" /> 
</form> 

Ve bu onu getirilmeye gerekiyor: Ben SO jquery-json dahil en cevapları çalıştılar

{ 
name: 'name value', 

phone: [ 
    { 
    type: 'cell', 
    number: '000' 
    }, 
    { 
    type: 'home', 
    number: '111' 
    } 
] 
} 

kütüphaneler ve bunların çoğu böyle bir şey dönmek:

{ 
'name': 'name value', 
'phone[0][type]': 'cell', 
'phone[0][number]': '000', 
'phone[1][type]': 'home', 
'phone[1][number]': '111', 
} 

Bu şey olduğunu kullanamıyorum! : P

Herkese şimdiden teşekkürler.

cevap

18

Sizin için yazdığım bu kodu deneyin ... Benim için iyi çalışıyor, sadece veri sonucunuzu kullanarak. Üzerinde çalışabilir ve basit bir jQuery eklentisi hazırlayabilirsiniz ...

Örnek, tam olarak çalışması için JSON.stringify'a ihtiyaç duyar.

var d = { 
    'name': 'name value', 
    'phone[0][type]': 'cell', 
    'phone[0][number]': '000', 
    'phone[1][type]': 'home', 
    'phone[1][number]': '111', 
}; 

$(document).ready(function(){ 

    arrangeJson(d); 
    alert(JSON.stringify(d)); 
}); 

function arrangeJson(data){ 
    var initMatch = /^([a-z0-9]+?)\[/i; 
    var first = /^\[[a-z0-9]+?\]/i; 
    var isNumber = /^[0-9]$/; 
    var bracers = /[\[\]]/g; 
    var splitter = /\]\[|\[|\]/g; 

    for(var key in data) { 
     if(initMatch.test(key)){ 
      data[key.replace(initMatch,'[$1][')] = data[key]; 
     } 
     else{ 
      data[key.replace(/^(.+)$/,'[$1]')] = data[key]; 
     } 
     delete data[key]; 
    } 


    for (var key in data) { 
     processExpression(data, key, data[key]); 
     delete data[key]; 
    } 

    function processExpression(dataNode, key, value){ 
     var e = key.split(splitter); 
     if(e){ 
      var e2 =[]; 
      for (var i = 0; i < e.length; i++) { 
        if(e[i]!==''){e2.push(e[i]);} 
      } 
      e = e2; 
      if(e.length > 1){ 
       var x = e[0]; 
       var target = dataNode[x]; 
       if(!target){ 
        if(isNumber.test(e[1])){ 
         dataNode[x] = []; 
        } 
        else{ 
         dataNode[x] ={} 
        } 
       } 
       processExpression(dataNode[x], key.replace(first,''), value); 
      } 
      else if(e.length == 1){ 
       dataNode[e[0]] = value; 
      } 
      else{ 
       alert('This should not happen...'); 
      } 
     } 
    } 
} 
+1

Çok teşekkürler Juliano! Bu mükemmel çözüm! : D –

+0

Büyü gibi çalışır. 'Ad değerini', telefon [0] .Type ': 'hücreyi', 'telefonunu sizin Liste formu var d = { 'adı' olan bir durumun üstesinden gelmek için ona biraz modifikasyon Had [0]. Sayı ':' 000 ', ' telefon [1] .type ':' ev ', ' telefon [1] .number ':' 111 ', }; Sonuç, iç listesinin anahtarından (.) Içeri girdiyse, bu yüzden processExpression'daki ilk döngüden sonra Ekledim.) işlevi. –

+0

_key_, işlevde iki kez bildirildi. – robsch

1

Bu yapı ile herhangi bir JSON kitaplığının tüm işleri yapabileceğini sanmıyorum. Yani, kendi dönüşüm döngüsümüzü yazmanın daha kolay olduğunu düşünüyorum. http://jsfiddle.net/7MAUv/1/

mantık, gizli dinamik komutları gibi dizeleri çalıştırmak için eval oldukça basittir edilir: Burada

sizin dizgeleleştirme koddur. Mümkün olduğunca kolaylaştırmaya çalıştım, hemen hemen tüm satırlar yorumlandı.

BTW, soru sormakta özgürdür.

+0

Kodunuz kusursuz çalışıyor. Gönderiniz için çok teşekkür ederim. Değerlendirme bölümü olmadan yapılıp yapılamayacağını görmeye çalışacağım ama şimdilik harika olmalı. –

2

yoktur. Bunun form2js kitaplığına sahip olması gerekmez.

$.fn.serializeObject = function serializeObject() { 
     var o = {}; 
     var a = this.serializeArray(); 
     $.each(a, function() { 
      if (o[this.name] !== undefined) { 
       if (!o[this.name].push) { 
        o[this.name] = [o[this.name]]; 
       } 
       o[this.name].push(this.value || ''); 
      } else { 
       o[this.name] = this.value || ''; 
      } 
     }); 
     return o; 
    }; 

Form verilerini serileştirmek için bu kodu kullandım.

JSON.stringify($(this).serializeObject());//'this' points to the form 

Herhangi bir şüpheniz varsa, lütfen yorum eklemekten çekinmeyin.

+0

Bunun çalışması için formunuz neye benziyor? – trebor

0

Onun için sorular değil tam olarak ne, ama jQuery kütüphanesini kullanarak ve ajax göndermeden bir amaç için tefrika sizin karmaşık form ihtiyaç halinde, size kullanabileceğiniz bu

ajaxRunning = $.ajax(
    "?"+$('#yourForm').serialize(), 
    { 
     data: { 
      anotherData: 'worksFine', 
      etc: 'still works' 
     }, 
     success: function(result) { 
      doSth(); 
     }, 
     dataType: "json" 
}); 

gibi fiil kullanabilirsiniz $ .post ve $ .get olarak da

nJoy!

0

Bu sorunu çözen başka bir kitaplık Mario Izquierdo tarafından jquery.serializeJSON. JQuery'yi çalışır ve genişletir.