如何将表单数据作为单个JSON对象发送?

Kar*_*hik 5 jquery json spring-mvc form-submit

下面是我的代码(客户端),通过JQUERY Ajax调用以JSON格式发送表单数据

$(document).ready(function(){
    var contextroot = "/services/"
    $("#customerForm").submit(function(e){
        e.preventDefault();
        var form = $(this);
        var action = form.attr("action");
        var data = form.serializeArray();

        $.ajax({
                    url: contextroot+action,
                    dataType: 'json',
                    type: 'POST',
                    contentType: 'application/json',
                    data: JSON.stringify(data),
                    success: function(data){
                        console.log("DATA POSTED SUCCESSFULLY"+data);
                    },
                    error: function( jqXhr, textStatus, errorThrown ){
                        console.log( errorThrown );
                    }
        });
});
});
Run Code Online (Sandbox Code Playgroud)

下面是接受JSON数据的SPRING控制器(服务)

@RequestMapping(value="/customer/create", method = RequestMethod.POST)
    public CustomerDTO create(@RequestBody CustomerDTO customerDTO) {
        return customerService.create(customerDTO);
    }
Run Code Online (Sandbox Code Playgroud)

在提交表单时,我收到以下错误
HTTP400:BAD REQUEST - 由于语法无效,服务器无法处理请求.

我想这个错误是因为表单数据被序列化为JSON对象的数组,而不仅仅是请求体中的JSON对象,如下所示

[{ "Name": "名字", "值": "约翰"},{ "名": "姓氏", "值": "米勒"},{ "名": "电子邮件", "价值": "John@gmail.com"},{ "名称": "移动", "值": "99868377"}]

但是,服务只接受以下JSON数据
{"firstName":"John","lastName":"Miller","email":"John.kp @gmail.com","mobile":"99868377"}

如何将表单数据转换为单个JSON对象而不是JSON对象数组.

Kar*_*hik 8

我终于找到了解决方案.我编写了一个生成JSON对象的实用程序方法

$(document).ready(function(){
    var contextroot = "/services/"
    $("#customerForm").submit(function(e){
        e.preventDefault();
        var form = $(this);
        var action = form.attr("action");
        var data = form.serializeArray();

        $.ajax({
                    url: contextroot+action,
                    dataType: 'json',
                    type: 'POST',
                    contentType: 'application/json',
                    data: JSON.stringify(getFormData(data)),
                    success: function(data){
                        console.log("DATA POSTED SUCCESSFULLY"+data);
                    },
                    error: function( jqXhr, textStatus, errorThrown ){
                        console.log( errorThrown );
                    }
        });
});
});

//utility function
function getFormData(data) {
   var unindexed_array = data;
   var indexed_array = {};

   $.map(unindexed_array, function(n, i) {
    indexed_array[n['name']] = n['value'];
   });

   return indexed_array;
}
Run Code Online (Sandbox Code Playgroud)