2014-04-04 99 views
2

JavaScript代碼:

$.ajax({ 
    type: "POST", 
    url: "postTestingResult.php", 
    data: {data: JSON.stringify(sendData)}, 
    dataType: "json", 
    success: ajaxSuccess, 
    error: ajaxError 
}); 

PHP代碼

$data = json_decode($_POST['data'], TRUE); 

當我發佈一個複雜的數據結構到服務器,最外面的陣列正在成爲一個字符串。例如,JavaScript對象可能是

var data = {"apps": [[1,2,3], [4,5,6]]} 

透過JSON.stringify(數據)這成爲

"{"apps": "[[1,2,3], [4,5,6]]"}" //As seen via console.log(data) in Chrome console 

但這樣做的json_decode後($ _ POST [ '數據'],TRUE)成爲

array('apps' => '[[1,2,3], [4,5,6]]') //As seen via var_export($data, TRUE) 

這是怎麼回事?爲什麼數組被轉換爲字符串?查看完整的JSON對象和完整的PHP對象check out this pastebin with the two

任何幫助非常感謝,謝謝。

更新:回覆發現 我發現了主要的罪魁禍首。我也在使用Prototype.js,並且在對象原型中添加了toJSON方法。 Check out this SO question for details

+0

看起來像'JSON.stringify()'的問題,因爲這是嵌套數組變成字符串的時候。儘管如此,仍在思考可能發生的事情。 – Sam

+2

那麼,'sendData'是一個對象字面值?你有沒有嘗試發送它沒有'JSON.stringify()'。我不認爲你需要JSONify'POST'ed對象文字數據。 –

+0

@Darragh sendData是一個複雜的數據對象。你可以在我鏈接的pastebin中看到它的JSON.stringify版本。你可以想象它(顯然沒有鍵/數據):{[{[{[]},{[]}],{[{[]},{[]}]}],{}} –

回答

3

試試這個。明確地發送數據爲application/json,不包住sendData

var sendData = {'apps': [[1,2,3], [4,5,6]]}; 

$.ajax({ 
    type: 'POST', 
    url: 'postTestingResult.php', 
    data: JSON.stringify(sendData), // don't wrap your JSONified object 
    contentType: 'application/json' // set application/json - default is x-form-urlencoded 
}); 

注意頭部和數據:application/json

enter image description here

當然,正如你所強調的,數據將現在不在$_POST超全球範圍內。然而,這不是一個問題,得到的JSON數據串一個很常見的方式是通過php://input閱讀原始發佈數據:

$data = array(); 
$json = file_get_contents('php://input'); // read JSON from raw POST data 

if (!empty($json)) { 
    $data = json_decode($json, true); // decode 
} 

print_r($data); 

產量:

Array( 
    [apps] => Array ( 
    [0] => Array ( 
     [0] => 1 
     [1] => 2 
     [2] => 3) 
    [1] => Array ( 
     [0] => 4 
     [1] => 5 
     [2] => 6 
    ) 
)) 

希望這有助於:)

編輯

注意,PHP documentation狀態:

注:流用PHP打開://輸入只能讀一次;該流不支持查找操作。

但是,iirc已經或將會改變(可能在PHP 5.6中?)。儘管如此,請不要引用我的意思,而現在,如果您打算重新使用它,請不要忘記指定該流的內容!

+0

當您複製上面的代碼或在您的pastebin中使用數據時?你能檢查你的請求頭來檢查你的請求有效載荷嗎? –

+0

我忘了重新加載客戶端代碼:P現在好了,我想,謝謝!但是,物體看起來有點奇怪。例如,我將如何訪問以下的app_id? Array([permutation] => Array([permutation_id] => 66)[apps] => [{「app_id」:0,「app_name」:「CvP」}]) –

+0

上面看起來像一個愚蠢的問題,我做$ data ['apps'] [0] ['app_id']我不斷收到「PHP警告:非法字符串偏移'app_id'」 –