在通过AJAX发送JSON时,我遇到了一些非常奇怪的行为。
JSON数据:
data = {
"name": "box1",
"comment": ["fragile"],
"type_A": [
{
"item": "1",
"attr": [
"big",
"red"
]
},
{
"item": "2",
"attr": [
"small",
"red"
]
},
],
"type_B": [],
"misc": {}
};
POST请求:
$.ajax({
url: url,
type: "POST",
// data: JSON.stringify(data),
data: data,
success: function (result) {
console.log("inside success");
},
error: function (error) {
console.log("inside error");
}
});
如果我在没有data
的情况下传递JSON.stringify()
,则空字段type_B
和misc
会丢失/被删除。但是,如果我使用JSON.stringify()
,那么后端无法在没有JSON.parse()
的情况下正确解析它。有没有办法在不在后端执行JSON.parse()
的情况下不删除空字段?
我尝试在请求中添加contentType: "application/json"
和dataType: "json"
,但没有帮助。
答案 0 :(得分:2)
您标记为“JSON数据”的不是JSON。它是一个JavaScript对象文字。它是JavaScript源代码的一部分。它不是JSON数据文件。
当你使用jQuery的Ajax函数时,你可以将一些不同的东西传递给data
。
如果你传递一个对象,那么jQuery将表单URL编码。
网址编码数据没有标准方式来表示除平面键=值对之外的任何内容。
PHP引入了一个扩展,它允许您通过在键名中使用方括号来表达数组和关联数组。例如:
array[]=item1&array[]=item2
数组中的每个项目都由密钥副本表示。
如果您没有物品,则没有该名称的钥匙。
如果使用这种编码数据的方法,那么就无法表达空数组。你最接近的将是一个包含零长度字符串的数组。
如果你传递一个字符串,那么jQuery将按原样发送它。
使用JSON.stringify
会将您的对象转换为包含JSON数据的字符串。
JSON能够表达空数组。
但是,PHP不会自动解析JSON格式的请求。因此...
有没有办法在不在后端执行JSON.parse()的情况下不删除空字段?
没有。没有。您要么使用不支持空字段的格式,要么使用PHP不会自动为您解析的格式。
我尝试添加contentType:“application / json”
这告诉服务器您发送的数据被编码为JSON。如果您要发送JSON,那么您应该包含此内容。
它不会改变您发送的数据。您需要自己将数据编码为JSON。
和dataType:“json”到请求但没有帮助。
这告诉服务器您希望对请求的响应包含JSON。它还告诉jQuery忽略响应的内容类型,并将其解析为JSON,无论服务器是什么形式。
它对您发送的数据没有影响。
答案 1 :(得分:0)
Jquery在发送之前处理您的数据,并使用请求的post formdata而不是将JSON放在请求的主体中。
要避免这种情况,请使用processData: false
和contentType: 'application/json'
:
$.ajax({
url: url,
type: "POST",
processData: false,
contentType: 'application/json',
data: JSON.stringify(data),
success: function (result) {
console.log("inside success");
},
error: function (error) {
console.log("inside error");
}
});