2010-08-11 4 views
0

J'essaie d'utiliser jquery + json pour obtenir tous les éléments dans le formulaire et générer une var JSON à publier dans une méthode ASP.NET MVC.Comment je peux créer des nœuds fils json (JSON dans JSON)?

$.fn.serializeObject = function() { 
    var o = {}; 
    var a = this.serializeArray(); 
    $.each(a, function() { 
    if (o[this.name]) { 
    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; 
}; 


$("#btnPost").click(function() { 
    alert(JSON.stringify($("#frm").serializeObject()))); 
}); 

Il méthode obtenir tous les champs d'un formulaire et construire un JSON, mais il DonT mis JSON à l'intérieur JSON.

Exemple:

Si j'ai le formulaire de suivi:

<input name="person.name"><input name="person.age"><input name="person.address.street"> 

La chaîne sérialisée construire un JSON comme celui-ci

{ "person.name": "??", "person.age": "??", "person.address.street": "??" } 

je besoin d'un plug-in ou une fonction pour générer comme celui-ci :

{ "person": { "name" : "??", "age" : "??", "address":{ "street": "??" } } } 

Répondre

1

Votre problème n'est pas "JSON dans JSON" (ce qui est une erreur de toute façon - JSON supporte très bien l'imbrication), votre problème est que vous avez mal interprété le fonctionnement de ce processus.

Votre méthode serializeObject() est en train de lire les noms - comme des chaînes Il n'y a rien dans le javascript qui rend ce processus « automagiquement » résoudre le point notation pour vous - les périodes sont simplement considérées comme faisant partie du nom de la propriété.

Vous devrez diviser les noms sur les périodes et procéder en conséquence. Un petit peu de récursivité et vous êtes là.

$.fn.serializeObject = function() 
{ 
    var o = {}; 
    var a = this.serializeArray(); 
    $.each(a, function() 
    { 
    if (/\./.test(this.name)) 
    { 
     resolveProperty(o, this.name.split('.'), this.value);        
    } else { 
     o[this.name] = this.value; 
    } 
    }); 
    return o; 

    function resolveProperty(object, properties, value) 
    { 
    if (properties.length > 1) 
    { 
     var property = properties.shift(); 

     if ('undefined' == typeof object[property]) 
     { 
     object[property] = {}; 
     } 
     resolveProperty(object[property], properties, value); 
    } else { 
     object[properties.shift()] = value; 
    } 
    } 
};