serializeObject

HTML

<form id="testForm">
    <input type="text" name="title" value="TITLE" /><br />
    <input type="text" name="children[0][0].label" value="CHILD LABEL 0" /><br />
    <input type="text" name="children[0][1].value" value="CHILD VALUE 0" /><br />
    <input type="text" name="children[1].label" value="CHILD LABEL 1" /><br />
    <input type="text" name="children[1].value" value="CHILD VALUE 1" /><br />
    <input type="text" name="children[1].extra[0]" value="CHILD EX 0" /><br />
    <input type="text" name="children[1].extra[1]" value="CHILD EX 1" />
    <input type="submit" value="Submit"/>
</form>
<div id="output"></div>

JavaScript

$.fn.serializeObject = function() {
    function pushObject(obj, prop) {
        if (!obj[prop]) { obj[prop] = {}; }
        return obj[prop];
    }

    function pushArray(obj, prop) {
        if (!obj[prop]) { obj[prop] = []; }
        return obj[prop];
    }

    function pushValue(obj, prop, val) {
        if (obj[prop] != null) {
            if (!$.isArray(obj[prop])) { obj[prop] = [obj[prop]]; }
            obj[prop].push(val);
        } else {
            obj[prop] = val;
        }
        return obj[prop];
    }
    
    function pushIndexedProp(obj, indexedProp, val) {
        var indexes = splitIndexes(indexedProp),
            prop = indexes.shift(),
            lastIndex = indexes.pop();
        if (lastIndex != null) {
            obj = pushArray(obj, prop);
            $.each(indexes, function (i, index) {
                obj = pushArray(obj, index);
            });
            prop = lastIndex;
        }
        return (val != null) ? pushValue(obj, prop, val) : pushObject(obj, prop);
    }

    function splitIndexes(s) {
        var result = [];
        var start = s.indexOf('[');
        if (start >= 0) {
            result.push(s.substring(0, start));
            while (start >= 0) {
                var end = s.indexOf(']', start + 1);
                if (end >= 0) {
                    result.push(parseInt(s.substring(start + 1, end), 10));
                    start = s.indexOf('[', end + 1);
                } else {
                    start = -1;
                }
            }
        } else {
            result.push(s);
        }
        return result;
    }

    var result = {};
    $.each(this.serializeArray(), function() {
        var props = this.name.split('.'),
            lastProp = props.pop(),
            obj = result;
        $.each(props, function (i, prop) {
            obj = pushIndexedProp(obj, prop);
        });
        pushIndexedProp(obj, lastProp, this.value || '');
    });
    return...