2017-10-19 60 views
0

在通过AJAX发送JSON时,我遇到了一些非常奇怪的行为。通过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"的请求,但没有帮助。

+1

你是什么意思的“后端无法正确解析它”? – cybersam

+0

在后端使用JSON.parse有什么错误? –

+0

你的后端是什么?我认为你的问题是你的后端! – Lux

回答

-1

的Jquery发送前处理数据和使用要求的职位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"); 
    } 
}); 
+0

“jQuery在发送之前处理您的数据” - 如果您将字符串传递给'data',则不会这样做。这并没有解决这个问题,即避免在数据到达服务器之后不得不将数据从JSON中解析出来。 – Quentin

+0

这解决了我的问题 –

2

您标示什么 “JSON数据” 不是JSON。它是一个JavaScript对象文字。它是JavaScript源代码的一部分。它不是JSON数据文件。

当你使用jQuery的Ajax功能,你可以通过一些不同的事情data

如果你传递一个对象,然后jQuery将表单URL编码。

URL编码数据没有标准方法来表示除了一组键=值对之外的任何其他内容。

PHP引入了一个扩展,它允许您在键名称中使用方括号来表示数组和关联数组。例如:

array[]=item1&array[]=item2 

数组中的每个项目都由密钥副本表示。

如果您没有项目,那么没有该名称的键。

如果使用这种编码数据的方法,那么你不能表达空数组。最接近你可能会有一个包含零长度字符串的数组。

如果你传递一个字符串,然后jQuery将只是把它作为是。

使用JSON.stringify会将您的对象转换为包含JSON数据的字符串。

JSON能够表达空数组。

但是,PHP不会自动解析JSON格式的请求。

所以......

有什么办法没有在后台做了JSON.parse()来不要剥去空字段?

不,没有。您要么使用不支持空字段的格式,要么使用PHP不会自动为您解析的格式。

我尝试添加的contentType: “应用/ JSON”

这告诉你要发送的数据编码为JSON服务器。如果你发送JSON,那么你应该包括这个。

它不会改变您发送的数据。您需要自己将数据编码为JSON。

和dataType:“json”的请求,但没有帮助。

这告诉服务器您希望对请求的响应包含JSON。它还告诉jQuery忽略响应的内容类型,并将其解析为JSON,无论服务器说的是什么。

它对您发送的数据没有影响。

+0

因此,在前端的这种情况下,我基本上没有办法做到这一点? –

+0

我真的不能'type_B:['']',那就是你说的对吗?因为它会在后端失败,因为它检查传入对象是否是JSON,而不是字符串 –

+0

正确。 “你要么使用不支持空字段的格式,要么使用PHP不会自动为你解析的格式。” – Quentin