Подтвердить что ты не робот

Сериализация сложной формы для объекта JSON с использованием jQuery

Я искал часы для этого и не нашел ответа. Пожалуйста, прочитайте весь вопрос, прежде чем пылать!:)

У меня есть такая же форма:

<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>

И нужно иметь возможность сериализовать его так:

{
 name: 'name value',

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

Я пробовал большинство ответов на SO, включая библиотеки jquery-json, и большинство из них возвращают что-то вроде этого:

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

Это что-то Я не могу использовать!: P

Спасибо всем заранее.

4b9b3361

Ответ 1

Попробуйте этот код, который я написал для вас... Работает отлично для меня, просто используя ваш результат данных. Вы можете работать над ним и создать простой плагин jQuery...

Образец нуждается в JSON.stringify для полной работы.

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...');
            }
        }
    }
}

Ответ 3

Это работало очень хорошо для меня. Для этого не требуется библиотека form2js.

$.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;
    };

Для сериализации данных формы я использовал этот код.

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

Если у вас есть какие-либо сомнения, не стесняйтесь добавлять комментарии.

Ответ 4

С этой структурой я не думаю, что любая библиотека JSON может выполнять всю работу. Поэтому я считаю, что проще написать собственный цикл преобразования.

Вот код вашей сериализации: http://jsfiddle.net/7MAUv/1/

Логика довольно проста, секрет - eval для запуска строк, таких как динамические команды. Я попытался сделать это как можно проще, почти все строки прокомментированы.

Кстати, не стесняйтесь задавать вопросы.

Ответ 5

Это не то, о чем вы просили, но если вы используете библиотеку jQuery и вам нужна сложная форма, сериализована с целью отправки ее в ajax, вы можете использовать sth, как этот

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

вы также можете использовать в $.post и $.get

NJoy!

Ответ 6

Другая библиотека, которая решает эту проблему, - jquery.serializeJSON Марио Искьердо. Он работает и расширяет jQuery.