ajax POST不发送部分对象

所以我有这个代码:

var ajaxUrl = 'a/7776/as'; var data = { 'answer' : { 'user_input' : [] }, 'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6' } $.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: data, success: function(json){ } }); 

但是,当我检查POST源时,似乎没有发送“回答”..

这是Firebug中的POST源代码:

 Parametersapplication/x-www-form-urlencoded form_build_id form-ffe6f10e9601470ed4cfe38257a959a6 Source form_build_id=form-ffe6f10e9601470ed4cfe38257a959a6 

为什么会出现这种情况,如何才能将对象的“回答”部分发送到AJAXpost?

来自TJ Crowder的精彩解释,显然知识渊博。 这是我对实际答案的看法。 我检查了我的HTTP流量并运行了上面的AJAX请求。 正如所料, answer没有发送。 另外上面跟着肾上腺素的回答,如果你在google上搜索“ajax不发送空数组”,你只能看到相关结果的数量,这也是一个问题。 我要做的是如果user_input是一个空数组,则发送null 。 我自己尝试确保并且再次如预期的那样,这次我观察到请求中发送了answer参数,以及user_input ,它使用下面的代码作为null发送。

 var userInput = []; //not sure where this is coming from in reality, but this is just an example. if (userInput.length == 0){ //in this example, this is obviously always true userInput = null; } var ajaxUrl = 'a/7776/as'; var data = { 'answer' : { 'user_input' : userInput }, 'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6' } $.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: data, success: function(json){ } }); 

默认的POST编码是multipart/form-data ,它由一系列name=value对组成。

您的结构无法直接映射到一系列平面的name=value对,因为它很复杂。 你有一个成员,它是一个对象,它有一个引用数组的属性。

如果要发送任意复杂的结构,则必须使用不同的编码并确保服务器了解该编码。 例如,您可以将JSON或XML发送到服务器,但您必须通过在ajax方法上设置contentType属性(它设置您要发送服务器的数据类型)来告诉它您正在做的事情。 。 然后,您的服务器必须了解如何反序列化该JSON或XML。

同时,确保您的结构可以映射到一系列平面的name=value对。

中途的房子是以multipart/form-data发送数据,但是你发送一个name=value对,并且value部分是不同的编码,如下所示:

 $.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: {json: JSON.stringify(data)}, success: function(json){ } }); 

这将发送一个name=valuejson name=value对,其中值为JSON编码的字符串。 您的服务器端将以正常方式检索json参数的值,然后使用JSON反序列化器重新创建对象图。

这种中途技术有时在框架中很方便,因此很难使用标准请求编码之外的其他东西。

因为你不能发布零长度数组。 POST(或HTTP查询)键不携带任何类型信息,零长度数组将在POST主体中有效地构建为null:message = []将序列化为”。

如果希望有效负载包含数组,则需要将traditional设置为true。

 $.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: data, traditional: true, success: function (json) {} });