2017-10-19 56 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