通过AJAX发送JSON时的奇怪行为

时间:2017-10-19 18:46:38

标签: javascript json ajax rest post

在通过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_Bmisc会丢失/被删除。但是,如果我使用JSON.stringify(),那么后端无法在没有JSON.parse()的情况下正确解析它。有没有办法在不在后端执行JSON.parse()的情况下不删除空字段?

我尝试在请求中添加contentType: "application/json"dataType: "json",但没有帮助。

2 个答案:

答案 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: falsecontentType: '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");
    }
});