2013-03-22 4 views
1

У меня есть форма в следующем формате (только части вида)Построить JSON-объект из формы

<input type="text" name="Journal[data][serviceaddress][company]" value="{{company}}"/> 
<input type="text" name="Journal[data][serviceaddress][address]" value="{{address}}"/> 
<input type="text" name="Journal[data][serviceaddress][zip]" value="{{zip}}"/> 
<textarea name="Journal[data][serviceaddress][notes]">{{notes}}</textarea> 
<input type="text" name="Journal[rows][1][title]"/> 
<input type="text" name="Journal[rows][1][body]"/> 
<input type="text" name="Journal[rows][2][title]"/> 
<input type="text" name="Journal[rows][2][body]"/> 

Я хотел бы преобразовать это в следующий JSON-объект

{ 
    data:{ 
     serviceaddress:{ 
      company: "companyvalue", 
      address: "addressvalue", 
      zip: "zipvalue", 
      notes: "notesvalue" 
     } 
    }, 
    rows:{ 
     1:{ 
      title: "row1title", 
      body: "row1body" 
     }, 
     2:{ 
      title: "row2title", 
      body: "row2body" 
     } 
    } 
} 

Какой был бы лучший способ сделать это? Я думал, что я должен быть тем, кто сделал это уже, но все, что я нашел при поиске, - это люди, которые хотят ввести имя в качестве ключа, а не вложенные данные JSON ...

+0

Вы хотите сделать это на стороне клиента или сервера? – Ares

+0

Предполагая, что вы хотите сделать это в JQuery, проверьте сериализованный API - http://api.jquery.com/serialize/. Это может вам помочь. – ryadavilli

+0

jQuery имеет форму.serializeArray() для этого ... – karaxuna

ответ

1

Поскольку я не мог найти ничего существующего, что я найдено было удовлетворительным решением, я создал свой собственный и здесь

function getData(){ 
      var data = {}; 
      $('.data input,.data textarea').each(function(){ 
       var val = $(this).val(); 
       var namestr = $(this).attr('name').substr(8); 
       namestr = namestr.substring(0,namestr.length-1); 
       var namearray = namestr.split(']['); 

       var currentlevel = data; 
       if (namearray[0] == 'data'){ 
        namearray = namearray.splice(1,namearray.length); 
        for (var i=0;i < namearray.length;i++){ 
         if (currentlevel[namearray[i]] == undefined && i != namearray.length-1){ 
          currentlevel[namearray[i]] = {}; 
         } 
         else if (namearray.length-1 == i){ 
          currentlevel[namearray[i]] = val; 
          break; 
         } //In the end, put a value 
         currentlevel = currentlevel[namearray[i]] 
        } 
       } 
      }); 
      return data; 
     } 

Как вы можете видеть, это выглядит только на входных/текстовое поле-тегов, где первый параметр «массив» в названии является «данные», то есть он будет анализировать только поля, где имя имеет формат «Myform [data] [value1]». Это может быть легко изменено в соответствии с вашими потребностями.

Смежные вопросы